#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define endl "\n"
#define task "trong co"
using namespace std;
int n,q,a[100009];
vector<int>ke[100009];
int depth[100009],par[100009],siz[100009],heavy[100009];
void dfs(int u,int prev)
{
par[u]=prev;
depth[u]=depth[prev]+1;
siz[u]=1;
int gmax=0;
for(auto i:ke[u])
{
if(prev!=i)
{
dfs(i,u);
if(gmax<siz[i])
{
heavy[u]=i;
gmax=siz[i];
}
siz[u]+=siz[i];
}
}
}
int head[100009],pos[100009],tp;
void hld(int u,int acs)
{
head[u]=acs;
pos[u]=++tp;
for(auto i:ke[u]) if(heavy[u]==i) hld(i,acs);
for(auto i:ke[u]) if(i!=par[u]&&heavy[u]!=i) hld(i,i);
}
ll segtree[400009],lazy[400009];
void passdown(int id,int l,int r)
{
int mid=(l+r)/2;
ll t=lazy[id];
segtree[id*2]+=(mid-l+1)*t;
lazy[id*2]+=t;
segtree[id*2+1]+=(r-mid)*t;
lazy[id*2+1]+=t;
lazy[id]=0;
}
void update(int id,int l,int r,int u,int v,int val)
{
if(l>v||r<u) return;
if(l>=u&&r<=v)
{
segtree[id]+=(r-l+1)*val;
lazy[id]+=val;
return;
}
passdown(id,l,r);
int mid=(l+r)/2;
update(id*2,l,mid,u,v,val);
update(id*2+1,mid+1,r,u,v,val);
segtree[id]=segtree[id*2]+segtree[id*2+1];
}
ll get(int id,int l,int r,int u,int v)
{
if(l>v||r<u) return 0;
if(l>=u&&r<=v) return segtree[id];
passdown(id,l,r);
int mid=(l+r)/2;
return get(id*2,l,mid,u,v)+get(id*2+1,mid+1,r,u,v);
}
void add(int x,int y)
{
while(head[x]!=head[y])
{
if(depth[head[x]]<depth[head[y]]) swap(x,y);
update(1,1,n,pos[head[x]],pos[x],1);
x=par[head[x]];
}
if(depth[x]<depth[y]) swap(x,y);
update(1,1,n,pos[y]+1,pos[x],1);
}
ll query(int x,int y)
{
ll res=0;
while(head[x]!=head[y])
{
if(depth[head[x]]<depth[head[y]]) swap(x,y);
res+=get(1,1,n,pos[head[x]],pos[x]);
x=par[head[x]];
}
if(depth[x]<depth[y]) swap(x,y);
res+=get(1,1,n,pos[y]+1,pos[x]);
return res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
if(fopen(task".inp","r"))
{
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin>>n>>q;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
ke[x].push_back(y);
ke[y].push_back(x);
}
dfs(1,0);
hld(1,1);
while(q--)
{
char type;
int x,y;
cin>>type>>x>>y;
if(type=='P') add(x,y);
else cout<<query(x,y)<<endl;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBsZCBsb25nIGRvdWJsZQojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIHRhc2sgInRyb25nIGNvIgp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbixxLGFbMTAwMDA5XTsKdmVjdG9yPGludD5rZVsxMDAwMDldOwppbnQgZGVwdGhbMTAwMDA5XSxwYXJbMTAwMDA5XSxzaXpbMTAwMDA5XSxoZWF2eVsxMDAwMDldOwp2b2lkIGRmcyhpbnQgdSxpbnQgcHJldikKewoJcGFyW3VdPXByZXY7CglkZXB0aFt1XT1kZXB0aFtwcmV2XSsxOwoJc2l6W3VdPTE7CglpbnQgZ21heD0wOwoJZm9yKGF1dG8gaTprZVt1XSkKCXsKCQlpZihwcmV2IT1pKQoJCXsKCQkJZGZzKGksdSk7CgkJCWlmKGdtYXg8c2l6W2ldKQoJCQl7CgkJCQloZWF2eVt1XT1pOwoJCQkJZ21heD1zaXpbaV07CgkJCX0KCQkJc2l6W3VdKz1zaXpbaV07CgkJfQoJfQp9CmludCBoZWFkWzEwMDAwOV0scG9zWzEwMDAwOV0sdHA7CnZvaWQgaGxkKGludCB1LGludCBhY3MpCnsKCWhlYWRbdV09YWNzOwoJcG9zW3VdPSsrdHA7Cglmb3IoYXV0byBpOmtlW3VdKSBpZihoZWF2eVt1XT09aSkgaGxkKGksYWNzKTsKCWZvcihhdXRvIGk6a2VbdV0pIGlmKGkhPXBhclt1XSYmaGVhdnlbdV0hPWkpIGhsZChpLGkpOwp9CgpsbCBzZWd0cmVlWzQwMDAwOV0sbGF6eVs0MDAwMDldOwp2b2lkIHBhc3Nkb3duKGludCBpZCxpbnQgbCxpbnQgcikKewoJaW50IG1pZD0obCtyKS8yOwoJbGwgdD1sYXp5W2lkXTsKCXNlZ3RyZWVbaWQqMl0rPShtaWQtbCsxKSp0OwoJbGF6eVtpZCoyXSs9dDsKCXNlZ3RyZWVbaWQqMisxXSs9KHItbWlkKSp0OwoJbGF6eVtpZCoyKzFdKz10OwoJbGF6eVtpZF09MDsKfQp2b2lkIHVwZGF0ZShpbnQgaWQsaW50IGwsaW50IHIsaW50IHUsaW50IHYsaW50IHZhbCkKewoJaWYobD52fHxyPHUpIHJldHVybjsKCWlmKGw+PXUmJnI8PXYpCgl7CgkJc2VndHJlZVtpZF0rPShyLWwrMSkqdmFsOwoJCWxhenlbaWRdKz12YWw7CgkJcmV0dXJuOwoJfQoJcGFzc2Rvd24oaWQsbCxyKTsKCWludCBtaWQ9KGwrcikvMjsKCXVwZGF0ZShpZCoyLGwsbWlkLHUsdix2YWwpOwoJdXBkYXRlKGlkKjIrMSxtaWQrMSxyLHUsdix2YWwpOwoJc2VndHJlZVtpZF09c2VndHJlZVtpZCoyXStzZWd0cmVlW2lkKjIrMV07Cn0KbGwgZ2V0KGludCBpZCxpbnQgbCxpbnQgcixpbnQgdSxpbnQgdikKewoJaWYobD52fHxyPHUpIHJldHVybiAwOwoJaWYobD49dSYmcjw9dikgcmV0dXJuIHNlZ3RyZWVbaWRdOwoJcGFzc2Rvd24oaWQsbCxyKTsKCWludCBtaWQ9KGwrcikvMjsKCXJldHVybiBnZXQoaWQqMixsLG1pZCx1LHYpK2dldChpZCoyKzEsbWlkKzEscix1LHYpOwp9Cgp2b2lkIGFkZChpbnQgeCxpbnQgeSkKewoJd2hpbGUoaGVhZFt4XSE9aGVhZFt5XSkKCXsKCQlpZihkZXB0aFtoZWFkW3hdXTxkZXB0aFtoZWFkW3ldXSkgc3dhcCh4LHkpOwoJCXVwZGF0ZSgxLDEsbixwb3NbaGVhZFt4XV0scG9zW3hdLDEpOwoJCXg9cGFyW2hlYWRbeF1dOwoJfQoJaWYoZGVwdGhbeF08ZGVwdGhbeV0pIHN3YXAoeCx5KTsKCXVwZGF0ZSgxLDEsbixwb3NbeV0rMSxwb3NbeF0sMSk7Cn0KbGwgcXVlcnkoaW50IHgsaW50IHkpCnsKCWxsIHJlcz0wOwoJd2hpbGUoaGVhZFt4XSE9aGVhZFt5XSkKCXsKCQlpZihkZXB0aFtoZWFkW3hdXTxkZXB0aFtoZWFkW3ldXSkgc3dhcCh4LHkpOwoJCXJlcys9Z2V0KDEsMSxuLHBvc1toZWFkW3hdXSxwb3NbeF0pOwoJCXg9cGFyW2hlYWRbeF1dOwoJfQoJaWYoZGVwdGhbeF08ZGVwdGhbeV0pIHN3YXAoeCx5KTsKCXJlcys9Z2V0KDEsMSxuLHBvc1t5XSsxLHBvc1t4XSk7CglyZXR1cm4gcmVzOwp9CmludCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgY291dC50aWUobnVsbHB0cik7CiAgICBpZihmb3Blbih0YXNrIi5pbnAiLCJyIikpCiAgICB7CiAgICAgICAgZnJlb3Blbih0YXNrIi5pbnAiLCJyIixzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrIi5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQogICAgY2luPj5uPj5xOwogICAgZm9yKGludCBpPTE7aTxuO2krKykKICAgIHsKICAgIAlpbnQgeCx5OwogICAgCWNpbj4+eD4+eTsKICAgIAlrZVt4XS5wdXNoX2JhY2soeSk7CiAgICAJa2VbeV0ucHVzaF9iYWNrKHgpOwogICAgfQogICAgZGZzKDEsMCk7CiAgICBobGQoMSwxKTsKICAgIHdoaWxlKHEtLSkKICAgIHsKICAgIAljaGFyIHR5cGU7CiAgICAJaW50IHgseTsKICAgIAljaW4+PnR5cGU+Png+Pnk7CiAgICAJaWYodHlwZT09J1AnKSBhZGQoeCx5KTsKICAgIAllbHNlIGNvdXQ8PHF1ZXJ5KHgseSk8PGVuZGw7CiAgICB9Cn0=