#include <bits/stdc++.h>
using namespace std;
#define il inline
const int N=1e5+5;
int n,T,w[N];
struct edge
{
int v,nxt;
}e[N<<1];
struct node
{
int x,cl,cr,lz;
}t[N<<2];
int head[N],et=0;
il void add(int u,int v)
{
e[++et].v=v;
e[et].nxt=head[u];
head[u]=et;
}
int siz[N],fa[N],h[N],dep[N],id[N],idx=0,a[N],top[N];
namespace init
{
il void dfs1(int u,int f)
{
dep[u]=dep[f]+1;
siz[u]=1;
fa[u]=f;
int hson=-1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==f)continue;
dfs1(v,u);
siz[u]+=siz[v];
if(hson<siz[v])hson=siz[v],h[u]=v;
}
}
il void dfs2(int u,int hh)
{
top[u]=hh;id[u]=++idx;a[idx]=w[u];
if(!h[u])return;
dfs2(h[u],hh);
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==fa[u]||v==h[u])continue;
dfs2(v,v);
}
}
}
namespace tr
{
#define ls (p<<1)
#define rs ((p<<1)|1)
#define mid ((l+r)>>1)
il node get(node a,node b)
{
if(a.cl==0)return b;
if(b.cl==0)return a;
node tt;
tt.x=a.x+b.x;tt.lz=0;
tt.cl=a.cl,tt.cr=b.cr;
if(a.cr==b.cl)tt.x--;
return tt;
}
il void pushup(int p)
{
t[p]=get(t[ls],t[rs]);
}
il void pb(int p)
{
if(!t[p].lz)return;
t[ls]=(node){1,t[p].cl,t[p].cl,1};
t[rs]=(node){1,t[p].cl,t[p].cl,1};
t[p].lz=0;
return;
}
il void build(int p,int l,int r)
{
if(l==r)
{
t[p]={1,a[l],a[l],0};
return;
}
build(ls,l,mid);build(rs,mid+1,r);
pushup(p);
}
il void change(int p,int l,int r,int ql,int qr,int c)
{
if(r<ql||l>qr)return;
if(ql<=l&&r<=qr)
{
t[p].x=1,t[p].cl=c,t[p].cr=c,t[p].lz=1;
return;
}
pb(p);
change(ls,l,mid,ql,qr,c);
change(rs,mid+1,r,ql,qr,c);
pushup(p);
}
il node query(int p,int l,int r,int ql,int qr)
{
if(r<ql||qr<l)return (node){0,0,0,0};
if(ql<=l&&r<=qr)return t[p];
pb(p);
return get(query(ls,l,mid,ql,qr),query(rs,mid+1,r,ql,qr));
}
}
il void upd(int a,int b,int c)
{
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]])swap(a,b);
tr::change(1,1,n,id[top[a]],id[a],c);
a=fa[top[a]];
}
if(dep[a]>dep[b])swap(a,b);
tr::change(1,1,n,id[a],id[b],c);
}
vector<int>q[3];
il void ask(int a,int b)
{
while(q[1].size()>0)q[1].pop_back();
while(q[2].size()>0)q[2].pop_back();
int ans=0,num1=1,num2=2;
node tt;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]]){swap(a,b);swap(num1,num2);}
tt=tr::query(1,1,n,id[top[a]],id[a]);
ans+=tt.x;
q[num1].push_back(tt.cr);
if(tt.x>1)q[num1].push_back(tt.cl);
a=fa[top[a]];
}
if(dep[a]>dep[b])
{
swap(a,b);swap(num1,num2);
}
tt=tr::query(1,1,n,id[a],id[b]);
ans+=tt.x;
q[num1].push_back(tt.cr);
if(tt.x>1)q[num1].push_back(tt.cl);
for(int i=1;i<q[1].size();i++)
{
if(q[1][i]==q[1][i-1])ans--;
}
for(int i=1;i<q[2].size();i++)
{
if(q[2][i]==q[2][i-1])ans--;
}
if(!q[1].empty()&&!q[2].empty()&&q[1][q[1].size()-1]==q[2][q[2].size()-1])ansa--;
cout<<ans<<'\n';
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>T;
for(int i=1;i<=n;i++)
{
cin>>w[i];
}
for(int i=1,u,v;i<n;i++)
{
cin>>u>>v;
add(u,v);add(v,u);
}
init::dfs1(1,0);
init::dfs2(1,1);
tr::build(1,1,n);
int a,b,c;
while(T--)
{
char t;
cin>>t>>a>>b;
if(t=='C'){cin>>c;upd(a,b,c);}
else ask(a,b);
}
return 0;
}