rt,WA4,5,6,7,8,11,12,13,14,15 代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200010;
const int S=1000;
const int INF=1e18;
struct Edge
{
int v,w,nxt;
};
int n,m,a[N];
int root,fa[N],ch[N],siz[N],dep[N],dis[N];
int top[N],dfn[N],rnk[N],dfc;
int len,l[S],r[S],bel[N],mn[S],tg[N],his[N];
int head[N],cnt;
bool rt[S];
Edge e[N*2];
bitset<N> vis[S];
vector<int> sub[S];
void add(int u,int v,int w)
{
cnt++;
e[cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs(int u,int f)
{
fa[u]=f;
siz[u]=1;
dep[u]=dep[f]+1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
int w=e[i].w;
if(v==f)
continue;
dis[v]=dis[u]+w;
dfs(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[ch[u]])
ch[u]=v;
}
}
void dfs2(int u,int f)
{
top[u]=f;
dfn[u]=++dfc;
rnk[dfc]=u;
if(ch[u])dfs2(ch[u],f);
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v!=ch[u]&&v!=fa[u])
dfs2(v,v);
}
}
void build()
{
len=sqrt(n);
for(int i=1;i<=len;++i)
{
l[i]=r[i-1]+1;
r[i]=i*len;
if(i==len)
r[i]=n;
mn[i]=INF;
for(int j=l[i];j<=r[i];++j)
{
bel[j]=i;
mn[i]=min(mn[i],dis[a[j]]);
if(!vis[i][a[j]])
{
sub[i].push_back(a[j]);
vis[i][a[j]]=1;
}
}
}
}
void mdf(int x,int y)
{
for(int i=x;i<=min(y,r[bel[x]]);++i)
{
a[i]=fa[a[i]];
vis[bel[x]][a[i]]=1;
rt[bel[x]]|=(a[i]==root);
mn[bel[x]]=min(dis[a[i]],mn[bel[x]]);
}
if(bel[x]!=bel[y])
for(int i=l[bel[y]];i<=y;++i)
{
a[i]=fa[a[i]];
vis[bel[y]][a[i]]=1;
rt[bel[y]]|=(a[i]==root);
mn[bel[y]]=min(dis[a[i]],mn[bel[y]]);
}
for(int i=bel[x]+1;i<=bel[y]-1;++i)
{
tg[i]++;
for(int j=0;j<sub[i].size();)
{
sub[i][j]=fa[sub[i][j]];
if(vis[i][sub[i][j]])
sub[i].erase(sub[i].begin()+j);
else
{
vis[i][sub[i][j]]=1;
rt[i]|=(sub[i][j]==root);
mn[i]=min(dis[sub[i][j]],mn[i]);
++j;
}
}
}
}
void jump(int &x,int k)
{
if(x==root)return;
while(1)
{
int hei=min(k,dfn[x]-dfn[top[x]]);
x=rnk[dfn[x]-hei];
k-=hei;
if(!k)break;
x=fa[x];
k--;
}
}
int ask(int x,int y,int res=INF)
{
for(int i=x;i<=min(y,r[bel[x]]);++i)
{
jump(a[i],tg[bel[x]]-his[i]);
his[i]=tg[bel[x]];
res=min(res,dis[a[i]]);
}
if(bel[x]!=bel[y])
for(int i=l[bel[y]];i<=y;++i)
{
jump(a[i],tg[bel[y]]-his[i]);
his[i]=tg[bel[y]];
res=min(res,dis[a[i]]);
}
for(int i=bel[x]+1;i<=bel[y]-1;++i)
{
if(rt[i])
return 0;
res=min(res,mn[i]);
}
return res;
}
signed main()
{
cin>>n>>m>>root;
for(int i=2;i<=n;++i)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
dfs(root,0);
dfs2(root,root);
fa[root]=root;
build();
for(int i=1;i<=m;++i)
{
int o,x,y;
cin>>o>>x>>y;
if(o==1)
mdf(x,y);
else
cout<<ask(x,y)<<'\n';
}
return 0;
}