SilverLi @ 2023-05-06 19:40:10
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define v first
#define w second
const int N=1e6+5;
char s;
bool vis[N];
int n,m;
vector<pair<int,int>> g[N];
int d[N],fa[N],si[N],son[N];
int Index,dfn[N],top[N],val[N];
int a[N],t[N],ad1[N],ad2[N];
int U[N],V[N];
void add1(int p) {
if(ad1[p]) {
t[p<<1]+=ad1[p];
t[p<<1|1]+=ad1[p];
ad1[p<<1]+=ad1[p];
ad1[p<<1|1]+=ad1[p];
ad1[p]=0;
}
}
void add2(int p) {
if(ad2[p]) {
t[p<<1]=ad2[p];
t[p<<1|1]=ad2[p];
ad2[p<<1]=ad2[p];
ad2[p<<1|1]=ad2[p];
ad2[p]=0;
ad1[p<<1]=ad1[p<<1|1]=0;
}
}
void down(int p) {add2(p),add1(p);}
void build(int l,int r,int p) {
if(l==r) { t[p]=a[l]; return; }
int m=(l+r)>>1;
build(l,m,p<<1);build(m+1,r,p<<1|1);
t[p]=max(t[p<<1],t[p<<1|1]);
}
void ADD(int l,int r,int S,int T,int p,int ch) {
if(l>=S&&r<=T) {
t[p]+=ch,ad1[p]+=ch;
return;
}
int m=l+r>>1;
down(p);
if(S<=m) ADD(l,m,S,T,p<<1,ch);
if(T>m) ADD(m+1,r,S,T,p<<1|1,ch);
t[p]=max(t[p<<1],t[p<<1|1]);
return;
}
void COVER(int l,int r,int S,int T,int p,int ch) {
if(l>=S&&r<=T) {
t[p]=ch,
ad2[p]=ch,
ad1[p]=0;
return;
}
int m=l+r>>1;
down(p);
if(S<=m) COVER(l,m,S,T,p<<1,ch);
if(T>m) COVER(m+1,r,S,T,p<<1|1,ch);
t[p]=max(t[p<<1],t[p<<1|1]);
return;
}
int MAXX(int l,int r,int S,int T,int p) {
if(l>=S&&r<=T) return t[p];
int m=(l+r)>>1,sum=0;
down(p);
if(S<=m) sum=MAXX(l,m,S,T,p<<1);
if(T>m) sum=max(sum,MAXX(m+1,r,S,T,p<<1|1));
return sum;
}
void dfs1(int u,int ft) {
d[u]=d[ft]+1,fa[u]=ft,
si[u]=1,vis[u]=1;
int mx=0;
for(auto i:g[u])
if(!vis[i.v]) {
dfs1(i.v,u);
si[u]+=si[i.v];
val[i.v]=i.w;
if(si[i.v]>mx) son[u]=i.v,mx=si[i.v];
}
}
void dfs2(int u,int toop) {
vis[u]=1,top[u]=toop;
dfn[u]=++Index,a[Index]=val[u];
if(!son[u]) return;
dfs2(son[u],toop);
for(auto i:g[u])
if(!vis[i.v]&&i.v!=fa[u]&&i.v!=son[u]) dfs2(i.v,i.v);
}
// change 函数出错
inline int change(int u,int v) {
return MAXX(1,n,dfn[u]+1,dfn[v],1);
}
inline void add(int u,int v,int w) {
while(top[u]!=top[v]) {
if(d[top[u]]<d[top[v]]) swap(u,v);
ADD(1,n,dfn[top[u]],dfn[u],1,w);
u=fa[top[u]];
}
if(d[u]>d[v]) swap(u,v);
ADD(1,n,dfn[u]+1,dfn[v],1,w);
}
signed main() {
cin>>n>>m;
for(int i=1;i<n;++i) {
int u,v; cin>>u>>v;
U[i]=u,V[i]=v;
g[u].push_back(make_pair(v,0)),
g[v].push_back(make_pair(u,0));
}
dfs1(1,1);memset(vis,0,sizeof(vis));
dfs2(1,1);
build(1,n,1);
while(m--) {
cin>>s;
if(s=='P') {
int u,v; cin>>u>>v;
add(u,v,1);
} else if(s=='Q') {
int u,v; cin>>u>>v;
cout<<change(u,v)<<endl;
}
}
return 0;
}