rt
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,rt,w[N];
int fi[N],ne[N<<1],to[N<<1],num;
void add(int x,int y)
{
ne[++num]=fi[x];fi[x]=num;to[num]=y;
ne[++num]=fi[y];fi[y]=num;to[num]=x;
}
int f[N<<2],la[N<<2],a[N],tot;
void pd(int k,int l,int r)
{
la[k<<1]=la[k];
la[k<<1|1]=la[k];
int mid=(l+r)>>1;
f[k<<1]=1;a[mid]=la[k];
f[k<<1|1]=1;a[mid+1]=la[k];
la[k]=0;
}
void js(int k,int l,int r)
{
if(l==r)
{
f[k]=1;
return;
}
int mid=(l+r)>>1;
js(k<<1,l,mid);
js(k<<1|1,mid+1,r);
f[k]=f[k<<1]+f[k<<1|1];
if(a[mid]==a[mid+1]) f[k]--;
}
int que(int k,int l,int r,int x,int y)
{
if(l>=x&&r<=y)
return f[k];
int mid=(l+r)>>1,ans=0;
if(la[k]) pd(k,l,r);
if(mid>=x) ans+=que(k<<1,l,mid,x,y);
if(mid<y) ans+=que(k<<1|1,mid+1,r,x,y);
if(mid>=x&&mid<y&&a[mid]==a[mid+1]) ans--;
return ans;
}
void ud(int k,int l,int r,int x,int y,int v)
{
if(l>=x&&r<=y)
{
a[l]=a[r]=la[k]=v;
f[k]=1;
return;
}
int mid=(l+r)>>1;
if(la[k]) pd(k,l,r);
if(mid>=x) ud(k<<1,l,mid,x,y,v);
if(mid<y) ud(k<<1|1,mid+1,r,x,y,v);
f[k]=f[k<<1]+f[k<<1|1];
if(a[mid]==a[mid+1]) f[k]--;
}
int fa[N],son[N],top[N],size[N],deep[N],id[N];
void dfs1(int k)
{
int ma=0;
for(int i=fi[k];i;i=ne[i])
if(to[i]!=fa[k])
{
fa[to[i]]=k;
deep[to[i]]=deep[k]+1;
dfs1(to[i]);
if(size[to[i]]>ma)
{
ma=size[to[i]];
son[k]=to[i];
}
size[k]+=size[to[i]];
}
size[k]++;
}
void dfs2(int k)
{
id[k]=++tot;
a[tot]=w[k];
if(!son[k]) return;
top[son[k]]=top[k];
dfs2(son[k]);
for(int i=fi[k];i;i=ne[i])
if(to[i]!=fa[k]&&to[i]!=son[k])
{
top[to[i]]=to[i];
dfs2(to[i]);
}
}
void tud(int x,int y,int v)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) swap(x,y);
ud(1,1,tot,id[top[x]],id[x],v);
x=fa[top[x]];
}
if(deep[x]<deep[y]) swap(x,y);
ud(1,1,tot,id[y],id[x],v);
}
int tque(int x,int y)
//可以确认是这个函数的锅,但不知道错在哪了
{
int ans=0;
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) swap(x,y);
ans+=que(1,1,tot,id[top[x]],id[x]);
if(a[id[fa[top[x]]]]==a[id[top[x]]]) ans--;
x=fa[top[x]];
}
if(deep[x]<deep[y]) swap(x,y);
ans+=que(1,1,tot,id[y],id[x]);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
int x,y,z;
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
}
rt=1;
top[rt]=fa[rt]=rt;
dfs1(rt);
dfs2(rt);
js(1,1,tot);
char qq[3];
while(m--)
{
scanf("%s",qq);
if(qq[0]=='Q')
{
scanf("%d%d",&x,&y);
printf("%d\n",tque(x,y));
}
else
{
scanf("%d%d%d",&x,&y,&z);
tud(x,y,z);
}
}
return 0;
}