Advertisement
Guest User

QTREE3 chi ashxatum

a guest
May 3rd, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <time.h>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <set>
  8. #include <queue>
  9. #include <string>
  10. #include <cstring>
  11. #include <map>
  12. #include <stack>
  13. #include <cmath>
  14. #include <iostream>
  15. using namespace std;
  16. #define mp make_pair
  17. #define ALL(x) (x).begin(),(x).end()
  18. #define sqr(x) ((x)*(x))
  19. #define ABS(x) (((x)>=0)?(x):-1*(x))
  20. #define geti(x) scanf("%d", &x)
  21. #define puti(x) printf("%d\n", x)
  22. typedef double real;
  23. typedef long long ll;
  24. typedef pair<int,int> pt;
  25. const int INF = 1000*1000*1000+7;
  26. const long long INF64 = 1e18;
  27. const real EPS = 1e-8;
  28.  
  29. const int MN = 100*1000+3;
  30. const int NN = 100+3;
  31. vector<int> T[MN];
  32. vector<int> HW[MN];
  33. int HP[MN];
  34. int SZ[MN];
  35. int HID[MN];
  36. int DEP[MN];
  37. int C[MN];
  38. int P[MN][19];
  39. void dfs(int v, int p=0){
  40. P[v][0] = p;
  41. DEP[v] = DEP[p]+1;
  42. for(int i=1;i<19;i++){
  43. P[v][i] = P[P[v][i-1]][i-1];
  44. }
  45. C[v] = 1;
  46. for(int i=0;i<T[v].size();i++){
  47. int to = T[v][i];
  48. if(to == P[v][0])continue;
  49. dfs(to,v);
  50. C[v]+=C[to];
  51. }
  52. }
  53. void heavy_dfs(int v,int heavy){
  54. HID[v] = heavy;
  55. for(int i=0;i<T[v].size();i++){
  56. int to = T[v][i];
  57. if(to == P[v][0])continue;
  58. if(C[to]*2 >= C[v]){
  59. dfs(to,heavy);
  60. }
  61. else{
  62. dfs(to,to);
  63. }
  64. }
  65. HW[heavy].push_back(v);
  66. HP[v] = SZ[HID[v]]++;
  67. }
  68. typedef struct item * pitem;
  69. struct item{
  70. pitem l,r;
  71. set<int> S;
  72. item():l(NULL),r(NULL){}
  73. };
  74. item Q[4*MN];int nq;
  75. pitem HPIT[MN];
  76. void update(int id,pitem &v,int pos,int l=-1, int r=-1){
  77. if(l==-1){l=0;r=SZ[id]-1;}
  78. if(!v){ v = &Q[nq++];}
  79.  
  80. if(v->S.find(-pos) != v->S.end()){
  81. v->S.erase(-pos);
  82. }
  83. else{
  84. v->S.insert(-pos);
  85. }
  86.  
  87. if(l==r){
  88. return;
  89. }
  90. int m = (l+r)/2;
  91. if(m >= pos){
  92. update(id,v->l,pos,l,m);
  93. }
  94. else{
  95. update(id,v->r,pos,m+1,r);
  96. }
  97. }
  98.  
  99. int query(int id,pitem v, int ql,int qr,int l=-1, int r=-1){
  100. if(l==-1){l=0;r=SZ[id]-1;}
  101. if(!v){ return INF;}
  102. if(ql>qr){return INF;}
  103. if(ql==l && qr == r){
  104. if(v->S.size()==0){
  105. return INF;
  106. }
  107. return *(v->S.begin());
  108. }
  109. int m = (l+r)/2;
  110. return min(query(id,v->l,ql,min(qr,m),l,m),query(id,v->r,max(ql,m+1),qr,m+1,r));
  111. }
  112. int get(int f){
  113. int minv = -1;
  114. for(;DEP[f] >= DEP[1];){
  115. int v = HID[f];
  116. int ret = -query(v,HPIT[v],HP[f],HP[v]);
  117. if(ret!= -INF){
  118. if(minv == -1 || DEP[minv] > DEP[ HW[v][ret] ]){
  119. minv = HW[v][ret];
  120. }
  121. }
  122. f = P[v][0];
  123. }
  124. return minv;
  125. }
  126. void solve(){
  127. nq = 0;
  128. int n,q;
  129. geti(n);geti(q);
  130. for(int i=0;i<n-1;i++){
  131. int a,b;
  132. geti(a);geti(b);
  133. T[a].push_back(b);
  134. T[b].push_back(a);
  135. }
  136. dfs(1);
  137. heavy_dfs(1,1);
  138. for(int i=0;i<q;i++){
  139. int cmd,b;
  140. geti(cmd);geti(b);
  141. if(cmd == 1){
  142. //printf("%d\n", get(b));
  143. }
  144. else{
  145. update(HID[b],HPIT[HID[b]],HP[b]);
  146. }
  147. }
  148. }
  149.  
  150. int main(){
  151. //freopen(".in","r",stdin);
  152. //freopen(".out","w",stdout);
  153. solve();
  154. return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement