1AC9WA,时间卡过,目测错误极小(在10000+行出错),求条
#include<bits/stdc++.h>
using namespace std;
#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((pl+pr)>>1)
const int N=100005;
int n,m,fa[N],dep[N],son[N],top[N],siz[N],dfn[N],pw[N],a[N],cnt=0,root;
vector<int>e[N];
int tag[N<<2],tree[N<<2];
void dfs1(int f,int x)
{
fa[x]=f;dep[x]=dep[f]+1;siz[x]=1;
for(int i=0;i<e[x].size();i++)
{
int d=e[x][i];
if(d==f)continue;
dfs1(x,d);siz[x]+=siz[d];
if(siz[d]>siz[son[x]])son[x]=d;
}
}
void dfs2(int tp,int x)
{
top[x]=tp;dfn[x]=++cnt;pw[cnt]=x;
if(!son[x])return;
dfs2(tp,son[x]);
for(int i=0;i<e[x].size();i++)
{
int d=e[x][i];
if(d==fa[x]||d==son[x])continue;
dfs2(d,d);
}
}
inline void pushup(int p){tree[p]=min(tree[ls],tree[rs]);}
void build(int p,int pl,int pr)
{
if(pl==pr){tree[p]=a[pw[pl]];tag[p]=0;return;}
build(ls,pl,mid);build(rs,mid+1,pr);
pushup(p);
}
inline void pushdown(int p)
{
if(!tag[p])return;
tag[ls]=tag[rs]=tag[p];
tree[ls]=tree[rs]=tag[p];
tag[p]=0;
}
void upd(int p,int pl,int pr,int l,int r,int d)
{
if(l<=pl&&pr<=r){tree[p]=tag[p]=d;return;}
pushdown(p);
if(l<=mid)upd(ls,pl,mid,l,r,d);
if(r>mid)upd(rs,mid+1,pr,l,r,d);
pushup(p);
}
inline void update(int x,int y,int d)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);
upd(1,1,n,dfn[top[x]],dfn[x],d);
x=fa[top[x]];
//cout<<x<<' '<<y<<' '<<dfn[top[x]]<<' '<<dfn[x]<<' '<<d<<'\n';
}
if(dep[x]<dep[y])swap(x,y);
upd(1,1,n,dfn[y],dfn[x],d);
//cout<<x<<' '<<y<<' '<<dfn[y]<<' '<<dfn[x]<<' '<<d<<'\n';
}
int query(int p,int pl,int pr,int l,int r)
{
if(l>r)return 2147483647;
if(l<=pl&&pr<=r)return tree[p];
pushdown(p);int ans=2147483647;
if(l<=mid)ans=min(ans,query(ls,pl,mid,l,r));
if(r>mid)ans=min(ans,query(rs,mid+1,pr,l,r));
return ans;
}
inline int qry(int x)
{
int ans=2147483647;
if(x==root)return query(1,1,n,1,n);
if(dfn[x]+siz[x]>dfn[root]&&dfn[x]<=dfn[root])
{
int now=root;
while(dep[x]<dep[now]-1)now=fa[now];
ans=min(ans,query(1,1,n,dfn[x],dfn[now]-1));
ans=min(ans,query(1,1,n,dfn[now]+siz[now],dfn[x]+siz[x]-1));
}
else ans=query(1,1,n,dfn[x],dfn[x]+siz[x]-1);
return ans;
}
int main()
{
//ios::sync_with_stdio(0);
//cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<n;i++)
{
int x,y;cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
dfs1(0,1);dfs2(1,1);
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
cin>>root;
while(m--)
{
int op,x;cin>>op>>x;
if(op==1)root=x;
if(op==2)
{
int y,z;cin>>y>>z;
update(x,y,z);
}
if(op==3)cout<<qry(x)<<'\n';
}
return 0;
}