#include<bits/stdc++.h>
#define ll long long
#define mxn 100002
#define lg 20
#define pr pair<ll,pair<ll,ll> >
#define mp make_pair
#define st first
#define nd second
using namespace std;
struct XD_tree{
ll l,r,pre,lz,lc,rc;
}tr[mxn*lg];
ll trt,rrt;
struct bzm{
ll v,nt;
}e[mxn*2];
ll hd[mxn],tt;
ll n,m,a[mxn];
ll b[mxn],xl[mxn],tet;
ll sz[mxn],bfn[mxn],fa[mxn];
ll mxs[mxn],rt[mxn];
inline void rd(ll &x){x=0;short f=1;char c=getchar();while((c<'0'||c>'9')&&c!='-') c=getchar();if(c=='-') f=-1,c=getchar();while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();x*=f;}
inline void pt(ll x){if(x<0) putchar('-'),x=-x;if(x>9) pt(x/10);putchar(x%10+'0');}
inline void adde(ll u,ll v){
e[++tt]=(bzm){v,hd[u]};
hd[u]=tt;
}
inline void ptup(ll p){
ll l=tr[p].l,r=tr[p].r;
tr[p].pre=tr[l].pre+tr[r].pre;
if(tr[l].rc==tr[r].lc) tr[p].pre--;
tr[p].lc=tr[l].lc;
tr[p].rc=tr[r].rc;
}
inline void doit(ll p,ll k){
tr[p].lc=tr[p].rc=k;
tr[p].pre=1;
tr[p].lz=k;
}
inline void ptdn(ll p){
if(!tr[p].lz) return;
doit(tr[p].l,tr[p].lz);
doit(tr[p].r,tr[p].lz);
tr[p].lz=0;
}
inline void bd(ll &p,ll l,ll r){
if(!p) p=++trt;
if(l==r){
tr[p].lc=tr[p].rc=a[b[l]];
tr[p].pre=1;
return;
}
ll mid=l+r>>1;
bd(tr[p].l,l,mid);
bd(tr[p].r,mid+1,r);
ptup(p);
}
inline void chg(ll p,ll l,ll r,ll x,ll y,ll k){
if(l>y||r<x) return;
if(l>=x&&r<=y){
doit(p,k);
return;
}
ll mid=l+r>>1;
ptdn(p);
chg(tr[p].l,l,mid,x,y,k);
chg(tr[p].r,mid+1,r,x,y,k);
ptup(p);
}
inline pr ask(ll p,ll l,ll r,ll x,ll y){
if(l>y||r<x) return mp(0,mp(0,0));
if(l>=x&&r<=y) return mp(tr[p].pre,mp(tr[p].lc,tr[p].rc));
ll mid=l+r>>1;
ptdn(p);
pr zl=ask(tr[p].l,l,mid,x,y);
pr zr=ask(tr[p].r,mid+1,r,x,y);
pr z;
if(!zl.st) z=zr;
if(!zr.st) z=zl;
if(zl.st&&zr.st) z=mp(zl.st+zr.st-(zl.nd.nd==zr.nd.st),mp(zl.nd.st,zr.nd.nd));
ptup(p);
return z;
}
inline void dfs1(ll u,ll f){
ll mx=0;
bfn[u]=bfn[f]+1;
sz[u]=1;
rt[u]=u;
fa[u]=f;
for(ll i=hd[u],v;i;i=e[i].nt){
v=e[i].v;
if(v==f) continue;
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>mx){
mx=sz[v];
mxs[u]=v;
}
}
}
inline void dfs2(ll u,ll f){
xl[u]=++tet;
b[tet]=u;
if(mxs[u]){
rt[mxs[u]]=rt[u];
dfs2(mxs[u],u);
for(ll i=hd[u],v;i;i=e[i].nt){
v=e[i].v;
if(v==f||v==mxs[u]) continue;
dfs2(v,u);
}
}
}
inline void v1(ll x,ll y,ll z){
if(rt[x]==rt[y]){
if(xl[x]>xl[y]) swap(x,y);
chg(rrt,1,n,xl[x],xl[y],z);
return;
}
if(xl[rt[x]]<xl[rt[y]]) swap(x,y);
chg(rrt,1,n,xl[rt[x]],xl[x],z);
x=fa[rt[x]];
v1(x,y,z);
}
inline pr v2(ll x,ll y,bool v){
if(rt[x]==rt[y]){
if(xl[x]>xl[y]) swap(x,y),v=!v;
pr z=ask(rrt,1,n,xl[x],xl[y]);
if(v) swap(z.nd.st,z.nd.nd);
return z;
}
if(xl[rt[x]]<xl[rt[y]]) swap(x,y),v=!v;
pr zl=ask(rrt,1,n,xl[rt[x]],xl[x]);
x=fa[rt[x]];
pr zr=v2(x,y,v);
pr z;
if(!zl.st) z=zr;
if(!zr.st) z=zl;
if(zl.st&&zr.st) z=mp(zl.st+zr.st-(zl.nd.nd==zr.nd.st),mp(zl.nd.st,zr.nd.nd));
if(v) swap(z.nd.st,z.nd.nd);
return z;
}
int main(){
rd(n),rd(m);
for(ll i=1;i<=n;i++)
rd(a[i]);
for(ll i=1,u,v;i<n;i++)
rd(u),rd(v),adde(u,v),adde(v,u);
dfs1(1,0);
dfs2(1,0);
bd(rrt,1,n);
while(m--){
char c;
ll x,y,z;
cin>>c,rd(x),rd(y);
if(c=='C') rd(z),v1(x,y,z);
else pt(v2(x,y,0).st),puts("");
}
}