dalao捞一下吧,实在调不动了
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
#define il inline
int n,m,wo[100001],head[100001],num,f[100001],deep[100001],hs[100001],snum[100001];
int l[100001],h[100001],loc[100001],lw[100001],lnum;
struct map
{
int cnt;
int to;
}map[200001];
struct s
{
int color;
int l;
int r;
int lazy;
}s[400001];
il int read()
{
int aa=0;
char ch=0;
while(ch<48||ch>57)ch=getchar();
while(ch>=48&&ch<=57)
{
aa=(aa<<3)+(aa<<1)+(ch^48);
ch=getchar();
}
return aa;
}
il void write(int aa)
{
if(aa>=10)write(aa/10);
putchar(aa%10+48);
return;
}
il void mbuild(int aa,int bb)
{
map[++num].to=head[aa];
head[aa]=num;
map[num].cnt=bb;
return;
}
il void dfs1(int root,int depth)
{
int maxs=-1,maxn=0;
deep[root]=depth;
snum[root]=1;
for(int i=head[root];i!=0;i=map[i].to)
{
if(map[i].cnt!=f[root])
{
f[map[i].cnt]=root;
dfs1(map[i].cnt,depth+1);
snum[root]+=snum[map[i].cnt];
if(snum[map[i].cnt]>maxs)maxn=map[i].cnt;
}
}
hs[root]=maxn;
return;
}
il void dfs2(int aa,int ahead)
{
l[++lnum]=aa;
h[aa]=ahead;
loc[aa]=lnum;
lw[lnum]=wo[aa];
if(snum[aa]==1)return;
dfs2(hs[aa],ahead);
for(int i=head[aa];i!=0;i=map[i].to)
{
if(map[i].cnt!=hs[aa]&&map[i].cnt!=f[aa])dfs2(map[i].cnt,map[i].cnt);
}
return;
}
il void sbuild(int l,int r,int aa)
{
s[aa].l=l;
s[aa].r=r;
if(l==r)
{
s[aa].color=1;
return;
}
int mid=(l+r)>>1;
sbuild(l,mid,aa<<1);
sbuild(mid+1,r,aa<<1|1);
s[aa].color=s[aa<<1].color+s[aa<<1|1].color-(lw[s[aa<<1].r]==lw[s[aa<<1|1].l]);
return;
}
il void push_down(int aa)
{
s[aa<<1].color=1;
s[aa<<1|1].color=1;
s[aa<<1].lazy=s[aa].lazy;
s[aa<<1|1].lazy=s[aa].lazy;
lw[s[aa<<1].r]=s[aa].lazy;
lw[s[aa<<1|1].l]=s[aa].lazy;
s[aa].lazy=0;
return;
}
il void add(int l,int r,int cc,int aa)
{
if(s[aa].l>r||s[aa].r<l)return;
if(s[aa].l>=l&&s[aa].r<=r)
{
lw[s[aa].l]=cc;
lw[s[aa].r]=cc;
s[aa].lazy=cc;
s[aa].color=1;
return;
}
if(s[aa].lazy!=0)push_down(aa);
if(s[aa<<1].r>=l)add(l,r,cc,aa<<1);
if(s[aa<<1|1].l<=r)add(l,r,cc,aa<<1|1);
s[aa].color=s[aa<<1].color+s[aa<<1|1].color-(lw[s[aa<<1].r]==lw[s[aa<<1|1].l]);
return;
}
il int cfind(int l,int r,int aa)
{
if(s[aa].l>r||s[aa].r<l)return 0;
if(s[aa].l>=l&&s[aa].r<=r)
{
return s[aa].color;
}
if(s[aa].lazy!=0)push_down(aa);
int sum1=0,sum2=0;
if(s[aa<<1].r>=l)sum1=cfind(l,r,aa<<1);
if(s[aa<<1|1].l<=r)sum2=cfind(l,r,aa<<1|1);
if(sum1!=0&&sum2!=0)
{
return sum1+sum2-(lw[s[aa<<1].r]==lw[s[aa<<1|1].l]);
}
else
{
return max(sum1,sum2);
}
}
il void col(int aa,int bb,int ccc)
{
if(h[aa]==h[bb])
{
if(deep[aa]>deep[bb])add(loc[bb],loc[aa],ccc,1);
else add(loc[aa],loc[bb],ccc,1);
}
else
{
if(deep[h[aa]]<deep[h[bb]])swap(aa,bb);
add(loc[h[aa]],loc[aa],ccc,1);
col(f[h[aa]],bb,ccc);
}
return;
}
il int que(int aa,int bb)
{
int sum=0;
if(h[aa]==h[bb])
{
if(deep[aa]>deep[bb])sum+=cfind(loc[bb],loc[aa],1);
else sum+=cfind(loc[aa],loc[bb],1);
}
else
{
if(deep[h[aa]]<deep[h[bb]])swap(aa,bb);
sum+=cfind(loc[h[aa]],loc[aa],1);
sum+=que(f[h[aa]],bb);
if(lw[loc[h[aa]]]==lw[loc[f[h[aa]]]])--sum;
}
return sum;
}
signed main()
{
n=read();
m=read();
for(int i=1;i<=n;++i)
{
wo[i]=read();
}
for(int i=1;i<n;++i)
{
int u,v;
u=read();
v=read();
mbuild(u,v);
mbuild(v,u);
}
dfs1(1,1);
dfs2(1,1);
sbuild(1,n,1);
for(int i=1;i<=m;++i)
{
char op;
cin>>op;
if(op=='C')
{
int a,b,c;
a=read();
b=read();
c=read();
col(a,b,c);
}
else
{
int a,b,ans=0;
a=read();
b=read();
ans=que(a,b);
write(ans);
putchar(10);
}
}
return 0;
}