首先声明:本人蒟蒻,马蜂抽象
WA #2 90分
#include <iostream>
#include <cstring>
using namespace std;
const int N=100010;
long long lazy[N*4],m,rk[N],nnn[N],SBmin[4*N],n,ti,fir[N],nex[N*2],to[N*2],cnt,siz[N],dad[N],dep[N],heavy[N],top[N],dfn[N],root;
void add(long long u,long long v){
cnt++;
nex[cnt]=fir[u];
fir[u]=cnt;
to[cnt]=v;
}
void dfs1(long long u,long long baba){
siz[u]=1;
dad[u]=baba;
dep[u]=dep[baba]+1;
heavy[u]=-1;
long long ma=0;
for(long long i=fir[u];i;i=nex[i]){
long long v=to[i];
if(v==baba)continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>ma){
ma=siz[v];
heavy[u]=v;
}
}
}
void dfs2(long long u,long long xh){
top[u]=xh;
dfn[u]=++ti;
rk[ti]=u;
if(heavy[u]!=-1){
dfs2(heavy[u],xh);
}
for(long long i=fir[u];i;i=nex[i]){
long long v=to[i];
if(v!=dad[u]&&v!=heavy[u]){
dfs2(v,v);
}
}
}
void build(long long k,long long l,long long r){
if(l>r)return;
if(l==r){
SBmin[k]=nnn[rk[l]];
return;
}
build(k*2,l,(l+r)/2);
build(k*2+1,(l+r)/2+1,r);
SBmin[k]=min(SBmin[k*2],SBmin[k*2+1]);
}
void pushdown(long long k){
if(!lazy[k]){
return;
}
SBmin[2*k]=lazy[k];
lazy[2*k]=lazy[k];
SBmin[2*k+1]=lazy[k];
lazy[2*k+1]=lazy[k];
lazy[k]=0;
}
void change(long long k,long long l,long long r,long long x,long long y,long long d) {
if(r<x||l>y) return ;
if(x<=l&&r<=y){
lazy[k]=d;
SBmin[k]=d;
return;
}
long long mid=(l+r)/2;
pushdown(k);
if(mid>=x)change(k*2,l,mid,x,y,d);
if(mid<y)change(k*2+1,mid+1,r,x,y,d);
SBmin[k]=min(SBmin[k*2],SBmin[k*2+1]);
}
long long ans_min(long long ql,long long qr,long long l,long long r,long long k){
if(r<ql||l>qr) return 9223372036854775807;
if(ql<=l&&r<=qr)return SBmin[k];
pushdown(k);
long long mid=(l+r)>>1,res=9223372036854775807;
if(ql<=mid)res=min(res,ans_min(ql,qr,l,mid,k*2));
if(qr>mid)res=min(res,ans_min(ql,qr,mid+1,r,k*2+1));
return res;
}
void modify(long long x,long long y,long long num){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
change(1,1,n,dfn[top[x]],dfn[x],num);
x=dad[top[y]];
}
if(dep[x]>dep[y])swap(x,y);
change(1,1,n,dfn[x],dfn[y],num);
}
main() {
cin>>n>>m;
for(long long i=1;i<n;i++){
long long a,b;
cin>>a>>b;
add(a,b);
add(b,a);
}
for(long long i=1;i<=n;i++){
cin>>nnn[i];
}
memset(SBmin,127,sizeof SBmin);
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
cin>>root;
while(m--){
long long a,b,c;
cin>>a;
if(a==1){
cin>>root;
}
else if(a==2){
cin>>b>>c>>a;
if(b>c)swap(b,c);
modify(b,c,a);
}
else if(a==3){
cin>>b;
if(b==root){
cout<<SBmin[1];
}
else if(dfn[b]>dfn[root]||dfn[b]+siz[b]<=dfn[root]){
cout<<ans_min(dfn[b],dfn[b]+siz[b]-1,1,ti,1);
}
else{
long long v=root,o;
while(top[b]!=top[v]){
if(dad[top[v]]==b){
o=top[v];
goto sb;
}
v=dad[top[v]];
}
o=heavy[b];
sb:;
long long ans=9223372036854775807;
ans=min(ans_min(dfn[1],dfn[o]-1,1,ti,1),ans_min(dfn[o]+siz[o],ti,1,ti,1));
cout<<ans;
}
cout<<endl;
}
}
return 0;
}
求调!
不要注意变量名