记录编号 |
336623 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HEOI 2016] 树 |
最终得分 |
100 |
用户昵称 |
Rapiz |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.510 s |
提交时间 |
2016-11-03 15:17:28 |
内存使用 |
4.15 MiB |
显示代码纯文本
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cctype>
#define file(x) "heoi2016_tree."#x
using std::swap;
const int V=1e5+10,L=1<<15;
namespace I{
char buf[L],*s,*t;
inline char gc(){
if(s==t) t=(s=buf)+fread(buf,1,L,stdin);
if(s==t) return EOF;
return *s++;
}
char nwc(){
char ch=gc();
if(!isalpha(ch)) ch=gc();
return ch;
}
inline int gi(){
int r=0,ch=gc();
while(!(ch<='9'&&ch>='0')) ch=gc();
while(ch<='9'&&ch>='0') r=r*10+ch-'0',ch=gc();
return r;
}
}using I::gi;using I::nwc;
int n,q,dfn[V],sz[V],top[V],fa[V],a[V],son[V],dfnclk,dec[V];
std::vector<int> to[V];
inline int lb(int x){return x&-x;}
void add(int p,int x){
while(p<=n) a[p]+=x,p+=lb(p);
}
int pre(int p){
if(!p) return 0;
int s=0;
while(p)
s+=a[p],p-=lb(p);
return s;
}
inline int sum(int l,int r){return pre(r)-pre(l-1);}
void dfs1(int u){
int v;
sz[u]=1;
for(int i=0;i<to[u].size();i++) if((v=to[u][i])!=fa[u]){
fa[v]=u;
dfs1(v);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int nt){
dec[dfn[u]=++dfnclk]=u;
top[u]=nt;
int v;
if(son[u]) dfs2(son[u],nt);
for(int i=0;i<to[u].size();i++) if((v=to[u][i])!=fa[u]&&v!=son[u]){
dfs2(v,v);
}
}
int solve(int a){
while(!sum(dfn[top[a]],dfn[a])) a=fa[top[a]];
int l=dfn[top[a]],r=dfn[a],mid;
while(l<r){
mid=l+r+1>>1;
if(sum(mid,r)) l=mid;
else r=mid-1;
}
return dec[l];
}
char s[2];
int main(){
freopen(file(in),"r",stdin);
freopen(file(out),"w",stdout);
//scanf("%d%d",&n,&q);
n=gi(),q=gi();
for(int i=1;i<n;i++) {
int u=gi(),v=gi();
to[u].push_back(v);
to[v].push_back(u);
}
dfs1(1),dfs2(1,1);
add(dfn[1],1);
for(int i=1;i<=q;i++){
int t;
t=nwc();
if(t=='C') add(dfn[gi()],1);
else if(t=='Q') printf("%d\n",solve(gi()));
}
}