Advertisement
istinishat

munim segment tree

May 3rd, 2018
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //source : munim
  2. //http://codeforces.com/contest/343/submission/25460356
  3.  
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6.  
  7. #define si(n) scanf("%d",&n)
  8. #define MAX 1000006
  9. #define INF 100000
  10.  
  11. int n,st[MAX],en[MAX],par[MAX],cnt=0;
  12. vector<int>gr[MAX];
  13. int tree[4*MAX],prop[4*MAX];
  14.  
  15. void go(int now,int p)
  16. {
  17.     st[now]=++cnt;
  18.     par[now]=p;
  19.     for(int i=0;i<gr[now].size();i++){
  20.         int to=gr[now][i];
  21.         if(to==p)continue;
  22.         go(to,now);
  23.     }
  24.     en[now]=cnt;
  25. }
  26.  
  27. void push_down(int node)
  28. {
  29.     tree[node*2]=tree[node*2+1]=prop[node*2]=prop[node*2+1]=prop[node];
  30.     prop[node]=0;
  31. }
  32.  
  33. void update(int node,int tl,int tr,int l,int r,int val)
  34. {
  35.     if(tl>r || tr<l)return;
  36.     if(tl>=l && tr<=r){
  37.         tree[node]=val;
  38.         if(val)prop[node]=val;
  39.         return ;
  40.     }
  41.     if(prop[node])push_down(node);
  42.     int mid=(tl+tr)/2;
  43.     update(node*2,tl,mid,l,r,val);
  44.     update(node*2+1,mid+1,tr,l,r,val);
  45.     tree[node]=min(tree[node*2],tree[node*2+1]);
  46.     return ;
  47. }
  48.  
  49. int quary(int node,int tl,int tr,int l,int r)
  50. {
  51.     if(tl>r || tr<l)return INF;
  52.     if(tl>=l && tr<=r)
  53.         return tree[node];
  54.     if(prop[node])return prop[node];
  55.     int mid=(tl+tr)/2,p1,p2;
  56.     p1=quary(node*2,tl,mid,l,r);
  57.     p2=quary(node*2+1,mid+1,tr,l,r);
  58.     return min(p1,p2);
  59. }
  60.  
  61. int main()
  62. {
  63.     //freopen("input.txt","r",stdin);
  64.     int i,j,n,q;
  65.     si(n);
  66.     for(i=1;i<n;i++){
  67.         int u,v;
  68.         si(u);si(v);
  69.         gr[u].push_back(v);
  70.         gr[v].push_back(u);
  71.     }
  72.     go(1,-1);
  73.     //memset(prop,-1,sizeof(prop));
  74.     si(q);
  75.     while(q--){
  76.         int c,v;
  77.         si(c);si(v);
  78.         if(c==1){
  79.             if(v !=1 && quary(1,1,n,st[v],en[v])==0)
  80.                 update(1,1,n,st[par[v]],st[par[v]],0);
  81.             update(1,1,n,st[v],en[v],1);
  82.         }
  83.         else if(c==2){
  84.             update(1,1,n,st[v],st[v],0);
  85.         }
  86.         else {
  87.             printf("%d\n",quary(1,1,n,st[v],en[v]));
  88.         }
  89.     }
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement