[bzoj1103]大都市meg
树剖板子
- 模板
#include<bits/stdc++.h>
using namespace std;
const int N=2.5e5+2;
int cnt,hed[N],to[N*2],nxt[N*2];
void adde(int u,int v){
cnt++;to[cnt]=v,nxt[cnt]=hed[u];hed[u]=cnt;
}
int n,m;
/*"----------------------<>----------------------"*/
#define lowbit(x) ((x)&(-x))
int t[N];
inline void add(int pos,int s){
for(;pos<=n;pos+=lowbit(pos))t[pos]+=s;
}
inline int arrey(int pos){
int ret=0;
for(;pos;pos-=lowbit(pos))ret+=t[pos];
return ret;
}
int qry(int l,int r){
return arrey(r)-arrey(l);
}
/*"----------------------<>----------------------"*/
int tp[N],dfn[N],fa[N],dep[N],sz[N],hs[N];
inline void dfs(int x,int pre){
sz[x]=1,fa[x]=pre;int mxsz=0;
for(int i=hed[x];i;i=nxt[i]){
int v=to[i];
if(v==pre)continue;
dep[v]=dep[x]+1;
dfs(v,x);
sz[x]+=sz[v];
if(mxsz<sz[v]){
hs[x]=v,mxsz=sz[v];
}
}
}
int num=0;
inline void dfs2(int x,int top){
tp[x]=top;
dfn[x]=++num;
add(num,1);
if(hs[x]) dfs2(hs[x],top);
for(int i=hed[x];i;i=nxt[i]){
int v=to[i];
if(v==fa[x]||v==hs[x])continue;
dfs2(v,v);
}
}
inline void Quest(int u){
int ans=0;
while(u){
ans+=qry(dfn[tp[u]]-1,dfn[u]);
u=fa[tp[u]];
}
printf("%d\n",ans-1);
}
char getopt(){
char x=0;while(x<'A'||x>'Z')x=getchar();
return x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
adde(u,v);adde(v,u);
}
scanf("%d",&m);
dfs(1,0);
dfs2(1,1);
m=n+m-1;
while(m--){
char opt=getopt();int x,y;
if(opt=='W'){
scanf("%d",&x);
Quest(x);
}else{
scanf("%d%d",&x,&y);
if(x<y)swap(x,y);
add(dfn[x],-1);
}
}
return 0;
}