//P1558
#include <bits/stdc++.h>
using namespace std;
struct node{
int l,r,v;
};
bool operator<(node a,node b){
return a.l<b.l;
}
set<node> s;
int n,m,l,t,o,tot,col[110];
set<node>::iterator split(int pos){
set<node>::iterator it=s.lower_bound({pos,0,0});
if(it!=s.end()&&it->l==pos){
return it;
}
if(it==s.begin()){
return it;
}
it--;
int l=it->l,r=it->r,v=it->v;
s.erase(it);
s.insert({l,pos-1,v});
return s.insert({pos,r,v}).first;
}
void assign(int l,int r,int v){
set<node>::iterator it2=split(r+1),it1=split(l);
/*for(set<node>::iterator it=it1;it!=it2;it++){
if(it->v){
col[it->v]--;
col[v]++;
if(col[it->v]==0){
tot--;
}
if(col[v]==1){
tot++;
}
}
}*/
s.erase(it1,it2);
s.insert({l,r,v});
//cout<<l<<r<<v;
}
int Ask(int l,int r){
int ans=0;
memset(col,0,sizeof(col));
set<node>::iterator it2=split(r+1),it1=split(l);
for(set<node>::iterator it=it1;it!=it2;it++){
if(it->v){
//cout<<it->l<<" "<<it->r<<" "<<it->v<<endl;
col[it->v]++;
}
}
for(int i=1;i<=t;i++){
if(col[i]){
ans++;
}
}
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin>>l>>t>>o;
s.insert({1,l,1});
while(o--){
int l,r,x;
char opt;
cin>>opt>>l>>r;
if(l>r){
swap(l,r);
}
if(opt=='C'){
cin>>x;
assign(l,r,x);
}
if(opt=='P'){
cout<<Ask(l,r)<<endl;
}
}
return 0;
}
//P14623
#include<bits/stdc++.h>
using namespace std;
int n,c,q,cnt,tot,fa[1000010],dfn[1000010],dep[1000010],top[1000010],hed[1000010];
int idx,siz[1000010],son[1000010],col[1000010],bck[1000010];
int ver[1000010],frm[1000010],nxt[1000010];
void add(int a,int b){
ver[++tot]=b,frm[tot]=a,nxt[tot]=hed[a],hed[a]=tot;
}
struct node{
int l,r,v;
node(int a=0,int b=-1,int c=0):l(a),r(b),v(c){}
};
bool operator<(node a,node b){
return a.l<b.l;
}
set<node>s;
set<node>::iterator split(int pos){
set<node>::iterator it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos){
return it;
}
if(it==s.begin()){
return it;
}
it--;
int l=it->l,r=it->r,v=it->v;
s.erase(it),s.insert(node(l,pos-1,v));
return s.insert(node(pos,r,v)).first;
}
void assign(int l,int r,int v){
set<node>::iterator it2=split(r+1),it1=split(l);
for(set<node>::iterator it=it1;it!=it2;it++){
if(it->v){
col[bck[it->v]]--;
bck[it->v]-=(it->r-it->l+1);
col[bck[it->v]]++;
}
}
col[bck[v]]--;
bck[v]+=(r-l+1);
col[bck[v]]++;
s.erase(it1,it2);
s.insert(node(l,r,v));
}
void dfs1(int u,int faa){
dep[u]=dep[faa]+1;
fa[u]=faa;
siz[u]=1;
for(int i=hed[u];i;i=nxt[i]){
int v=ver[i];
if(v==faa){
continue;
}
dfs1(v,u);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v]){
son[u]=v;
}
}
}
void dfs2(int u,int tp){
top[u]=tp;
dfn[u]=++cnt;
if(son[u]){
dfs2(son[u],tp);
}
for(int i=hed[u];i;i=nxt[i]){
int v=ver[i];
if(v==fa[u]||v==son[u]){
continue;
}
dfs2(v,v);
}
}
void update(int u,int v,int k){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]){
swap(u,v);
}
assign(dfn[top[u]],dfn[u],k);
u=fa[top[u]];
}
if(dep[u]>dep[v]){
swap(u,v);
}
if(u!=v){
assign(dfn[u]+1,dfn[v],k);
}
}
int main(){
scanf("%d%d%d",&n,&c,&q);
for(int i=1;i<=n;i++){
s.insert(node(i,i,0));
}
s.insert(node(n+1,n+1,0));
col[0]=c;
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs1(1,0);
dfs2(1,1);
while(q--){
int u,c,m;
scanf("%d%d%d",&u,&c,&m);
update(1,u,c);
printf("%d\n",col[m]);
}
return 0;
}