大水题
据说树链剖分可暴力过?
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline char nc()
{
static char buf[100000],*p1=buf,*p2=buf;
if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
return *p1++;
}
inline void read(int &x)
{
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}
inline void read(char &x)
{
for (x=nc();x!='A' && x!='W';x=nc());
}
const int N=250005;
namespace BIT{
#define lowbit(x) ((x)&-(x))
int maxn,c[N];
inline void init(int n){
maxn=n;
}
inline void add(int x,int r){
for (int i=x;i<=maxn;i+=lowbit(i))
c[i]+=r;
}
inline void add(int l,int r,int x){
add(l,x); add(r+1,-x);
}
inline int query(int x){
int ret=0;
for (int i=x;i;i-=lowbit(i))
ret+=c[i];
return ret;
}
}
struct edge{
int u,v,next;
};
edge G[N<<1];
int head[N],inum;
inline void add(int u,int v,int p)
{
G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;
}
int n;
int fat[N],size[N],depth[N];
int clk,tid[N],last[N];
#define V G[p].v
inline void dfs(int u,int fa){
fat[u]=fa; depth[u]=depth[fa]+1; size[u]=1;
tid[u]=++clk;
for (int p=head[u];p;p=G[p].next)
if (V!=fa)
dfs(V,u),size[u]+=size[V];
last[u]=tid[u]+size[u]-1;
}
int main()
{
int Q,iu,iv,ans; char order;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
read(n); BIT::init(n);
for (int i=1;i<n;i++)
read(iu),read(iv),add(iu,iv,++inum),add(iv,iu,++inum);
dfs(1,0);
read(Q); Q+=n-1;
while (Q--)
{
read(order);
if (order=='A')
{
read(iu); read(iv);
if (depth[iu]<depth[iv]) swap(iu,iv);
BIT::add(tid[iu],last[iu],1);
}
else if (order=='W')
{
read(iu);
ans=BIT::query(tid[iu]);
ans=depth[iu]-1-ans;
printf("%d\n",ans);
}
}
return 0;
}