#include<bits/stdc++.h>
using namespace std;
int size[100010], tp[100010], pos[100010], n, m, fa[100010], len=1, deep[100010], cnt, mp[100010], a[100010], mark[400010];
vector<int>e[100010];
struct node{
int l, r, sum;
}tr[400010];
void dfs1(int x){
size[x]=1;
for(auto v:e[x]){
if(v==fa[x])continue;
fa[v]=x;
deep[v]=deep[x]+1;
dfs1(v);
size[x]+=size[v];
}
}
void dfs2(int x){
mp[x]=++cnt;
int maxn=0, p=0;
for(auto v:e[x]){
if(v==fa[x])continue;
if(size[v]>maxn){
p=v;
maxn=size[v];
}
}
if(!p)return;
pos[p]=pos[x];
dfs2(p);
for(auto v:e[x]){
if(v==fa[x]||v==p)continue;
pos[v]=++len,tp[len]=v;
dfs2(v);
}
}
void push(int pos, long long l, long long r, int ll, int rr, long long x){
if(l>rr||r<ll)return;
if(l>=ll&&r<=rr){
tr[pos].l=tr[pos].r=x;
tr[pos].sum=1;
mark[pos]=x;
return;
}
int mid=(l+r)/2;
if(mark[pos]){
tr[pos*2].l=tr[pos*2].r=tr[pos*2+1].l=tr[pos*2+1].r=mark[pos];
tr[pos*2].sum=tr[pos*2+1].sum=1;
}
mark[pos]=0;
push(pos*2,l,mid,ll,rr,x);
push(pos*2+1,mid+1,r,ll,rr,x);
tr[pos].l=tr[pos*2].l;
tr[pos].r=tr[pos*2+1].r;
tr[pos].sum=tr[pos*2].sum+tr[pos*2+1].sum;
if(tr[pos*2].r==tr[pos*2+1].l&&tr[pos*2].r)tr[pos].sum--;
}
node pop(int pos, int l, int r, int ll, int rr){
if(l>rr||r<ll)return node{0,0,0};
if(l>=ll&&r<=rr){
return tr[pos];
}
int mid=(l+r)/2;
if(mark[pos]){
tr[pos*2].l=tr[pos*2].r=tr[pos*2+1].l=tr[pos*2+1].r=mark[pos];
tr[pos*2].sum=tr[pos*2+1].sum=1;
}
mark[pos]=0;
node x=pop(pos*2,l,mid,ll,rr);
node y=pop(pos*2+1,mid+1,r,ll,rr);
node z;
if(x.sum&&y.sum){
z.l=x.l,z.r=y.r;
}
else{
if(x.sum)z.l=x.l,z.r=x.r;
else z.l=y.l, z.r=y.r;
}
z.sum=x.sum+y.sum;
if(x.r==y.l&&x.r)z.sum--;
return z;
}
void add(int x, int y, int z){
while(pos[x]!=pos[y]){
if(deep[tp[pos[x]]]<deep[tp[pos[y]]])swap(x,y);
push(1,1,n,mp[tp[pos[x]]],mp[x],z);
x=fa[tp[pos[x]]];
}
if(deep[x]<deep[y])swap(x,y);
push(1,1,n,mp[y],mp[x],z);
}
int SUM(int x, int y){
int ans=0, last1=0, last2=0;
while(pos[x]!=pos[y]){
if(deep[tp[pos[x]]]<deep[tp[pos[y]]])swap(x,y),swap(last1,last2);
node sum=pop(1,1,n,mp[tp[pos[x]]],mp[x]);
if(sum.r==last1)ans--;
last1=sum.l;
ans+=sum.sum;
x=fa[tp[pos[x]]];
}
if(deep[x]<deep[y])swap(x,y),swap(last1,last2);
node sum=pop(1,1,n,mp[y],mp[x]);
ans+=sum.sum;
if(sum.r==last1)ans--;
if(sum.l==last2)ans--;
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++){
int x, y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
deep[1]=1;dfs1(1);pos[1]=1;tp[1]=1;dfs2(1);
for(int i=1;i<=n;i++)add(i,i,a[i]);
while(m--){
char op;
int x, y, z;
cin>>op;
if(op=='C'){
cin>>x>>y>>z;
add(x,y,z);
}
if(op=='Q'){
cin>>x>>y;
cout<<SUM(x,y)<<endl;
}
}
return 0;
}