WA 2,3,4,6,9,10,AC 1,5,7,8。
#include<bits/stdc++.h>
using namespace std;
typedef int t;
const int maxn=1e5+10;
int sum[maxn<<6],maxi[maxn<<6];
int pls[maxn<<6],prs[maxn<<6],cnt;
int rate[maxn],bel[maxn],n,q;
int head[maxn],fath[maxn],son[maxn],dep[maxn];
int dfn[maxn],siz[maxn],root[maxn],id;
vector<int>edge[maxn];
inline void pushup(t p){
sum[p]=sum[pls[p]]+sum[prs[p]];
maxi[p]=max(maxi[pls[p]],maxi[prs[p]]);
return;
}
inline void update(t d,t &p,t pl,t pr,t k){
if(!p) p=++cnt;
if(pl==pr){sum[p]=maxi[p]=k;return;}
int mid=(pl+pr)>>1;
if(d<=mid) update(d,pls[p],pl,mid,k);
else update(d,prs[p],mid+1,pr,k);
return pushup(p);
}
inline t querymax(t l,t r,t p,t pl,t pr){
if(!p) return 0;
if(l<=pl and pr<=r) return maxi[p];
int mid=(pl+pr)>>1,ans=0;
if(l<=mid) ans=max(ans,querymax(l,r,pls[p],pl,mid));
if(r>mid) ans=max(ans,querymax(l,r,prs[p],mid+1,pr));
return ans;
}
inline t querysum(t l,t r,t p,t pl,t pr){
if(!p) return 0;
if(l<=pl and pr<=r) return sum[p];
int mid=(pl+pr)>>1,ans=0;
if(l<=mid) ans+=querysum(l,r,pls[p],pl,mid);
if(r>mid) ans+=querysum(l,r,prs[p],mid+1,pr);
return ans;
}
inline void dfs1(t u,t dad){
fath[u]=dad; siz[u]=1;
dep[u]=dep[dad]+1;
for(int v:edge[u]){
if(v==dad) continue;
dfs1(v,u); siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
return;
}
inline void dfs2(t u,t hd){
head[u]=hd; dfn[u]=++id;
if(son[u]) dfs2(son[u],hd);
for(int v:edge[u]){
if(v!=son[u] and v!=fath[u]) dfs2(v,v);
}
return;
}
inline t qrysum(t u,t v,t k){
int ans=0;
while(head[u]!=head[v]){
if(dep[head[u]]<dep[head[v]]) swap(u,v);
ans+=querysum(dfn[head[u]],dfn[u],root[k],1,n);
u=fath[head[u]];
}
if(dep[u]<dep[v]) swap(u,v);
ans+=querysum(dfn[v],dfn[u],root[k],1,n);
return ans;
}
inline t qrymax(t u,t v,t k){
int ans=0;
while(head[u]!=head[v]){
if(dep[head[u]]<dep[head[v]]) swap(u,v);
ans=max(ans,querymax(dfn[head[u]],dfn[u],root[k],1,n));
u=fath[head[u]];
}
if(dep[u]<dep[v]) swap(u,v);
ans=max(ans,querymax(dfn[head[u]],dfn[u],root[k],1,n));
return ans;
}
int main(){ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>rate[i]>>bel[i];
}
string opt; int u,v;
for(int i=1;i<n;i++){
cin>>u>>v;
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs1(1,0); dfs2(1,1);
for(int i=1;i<=n;i++){
update(dfn[i],root[bel[i]],1,n,rate[i]);
}
for(int i=1;i<=q;i++){
cin>>opt>>u>>v;
if(opt=="CC"){
update(dfn[u],root[bel[u]],1,n,0);
update(dfn[u],root[bel[u]=v],1,n,rate[u]);
}
else if(opt=="CW"){
update(dfn[u],root[bel[u]],1,n,rate[u]=v);
}
else if(opt=="QS"){
cout<<qrysum(u,v,bel[u])<<"\n";
}
else{
cout<<qrymax(u,v,bel[u])<<"\n";
}
}
return 0;
}