记录编号 336623 评测结果 AAAAAAAAAA
题目名称 [HEOI 2016] 树 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.510 s
提交时间 2016-11-03 15:17:28 内存使用 4.15 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<cctype>
  5. #define file(x) "heoi2016_tree."#x
  6. using std::swap;
  7. const int V=1e5+10,L=1<<15;
  8. namespace I{
  9. char buf[L],*s,*t;
  10. inline char gc(){
  11. if(s==t) t=(s=buf)+fread(buf,1,L,stdin);
  12. if(s==t) return EOF;
  13. return *s++;
  14. }
  15. char nwc(){
  16. char ch=gc();
  17. if(!isalpha(ch)) ch=gc();
  18. return ch;
  19. }
  20. inline int gi(){
  21. int r=0,ch=gc();
  22. while(!(ch<='9'&&ch>='0')) ch=gc();
  23. while(ch<='9'&&ch>='0') r=r*10+ch-'0',ch=gc();
  24. return r;
  25. }
  26. }using I::gi;using I::nwc;
  27. int n,q,dfn[V],sz[V],top[V],fa[V],a[V],son[V],dfnclk,dec[V];
  28. std::vector<int> to[V];
  29. inline int lb(int x){return x&-x;}
  30. void add(int p,int x){
  31. while(p<=n) a[p]+=x,p+=lb(p);
  32. }
  33. int pre(int p){
  34. if(!p) return 0;
  35. int s=0;
  36. while(p)
  37. s+=a[p],p-=lb(p);
  38. return s;
  39. }
  40. inline int sum(int l,int r){return pre(r)-pre(l-1);}
  41. void dfs1(int u){
  42. int v;
  43. sz[u]=1;
  44. for(int i=0;i<to[u].size();i++) if((v=to[u][i])!=fa[u]){
  45. fa[v]=u;
  46. dfs1(v);
  47. sz[u]+=sz[v];
  48. if(sz[v]>sz[son[u]]) son[u]=v;
  49. }
  50. }
  51. void dfs2(int u,int nt){
  52. dec[dfn[u]=++dfnclk]=u;
  53. top[u]=nt;
  54. int v;
  55. if(son[u]) dfs2(son[u],nt);
  56. for(int i=0;i<to[u].size();i++) if((v=to[u][i])!=fa[u]&&v!=son[u]){
  57. dfs2(v,v);
  58. }
  59. }
  60. int solve(int a){
  61. while(!sum(dfn[top[a]],dfn[a])) a=fa[top[a]];
  62. int l=dfn[top[a]],r=dfn[a],mid;
  63. while(l<r){
  64. mid=l+r+1>>1;
  65. if(sum(mid,r)) l=mid;
  66. else r=mid-1;
  67. }
  68. return dec[l];
  69. }
  70. char s[2];
  71. int main(){
  72. freopen(file(in),"r",stdin);
  73. freopen(file(out),"w",stdout);
  74. //scanf("%d%d",&n,&q);
  75. n=gi(),q=gi();
  76. for(int i=1;i<n;i++) {
  77. int u=gi(),v=gi();
  78. to[u].push_back(v);
  79. to[v].push_back(u);
  80. }
  81. dfs1(1),dfs2(1,1);
  82. add(dfn[1],1);
  83. for(int i=1;i<=q;i++){
  84. int t;
  85. t=nwc();
  86. if(t=='C') add(dfn[gi()],1);
  87. else if(t=='Q') printf("%d\n",solve(gi()));
  88. }
  89. }