Advertisement
Guest User

Untitled

a guest
Feb 27th, 2020
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define pb push_back
  5. vector<int> g[100005];
  6. vector<int> st;
  7. int cnt[100005];
  8. int stree[400040];
  9. int ans[100005];
  10. int value;
  11. void dfs(int u,int par){
  12.     cnt[u]=1;
  13.     for(int v:g[u]){
  14.         if(v==par) continue;
  15.         dfs(v,u);
  16.         cnt[u]+=cnt[v];
  17.     }
  18.     st.pb(u);
  19. }
  20.  
  21. void build(int node,int b,int e){
  22.     if(b==e){
  23.         stree[node]=1;return;
  24.     }
  25.     int mid=(b+e)/2;
  26.  
  27.     int left=node*2;
  28.     int right=node*2+1;
  29.  
  30.     build(left,b,mid);
  31.     build(right,mid+1,e);
  32.     stree[node]=stree[left]+stree[right];
  33. }
  34.  
  35. void update (int node, int b,int e,int l,int r){
  36.  
  37.     //cout<<b<<" first "<<e<<endl;
  38.     if(!stree[node])return;
  39.     if(value<=0)return;
  40.     if(r<b||l>e)return;
  41.     //cout<<b<<" second "<<e<<endl;
  42.     if(b==e){
  43.         stree[node]=0;
  44.         value--;
  45.         //cout<<value<<endl;
  46.         //cout<<b<<" inside b==e "<<st[b]<<endl;
  47.         ans[st[b-1]]=1;
  48.         return;
  49.     }
  50.     int mid=(b+e)/2;
  51.  
  52.     int left=node*2;
  53.     int right=node*2+1;
  54.     update(left,b,mid,l,r);
  55.     update(right,mid+1,e,l,r);
  56.     stree[node]=stree[left]+stree[right];
  57. }
  58.  
  59. int main(){
  60.     int t,n,x,y;
  61.     scanf("%d",&t);
  62.     for(int cs=1;cs<=t;cs++){
  63.  
  64.         scanf("%d",&n);
  65.         for(int i=1;i<n;i++){
  66.  
  67.             scanf("%d %d",&x,&y);
  68.             g[x].pb(y);
  69.             g[y].pb(x);
  70.         }
  71.  
  72.         for(int i=1;i<=n;i++){
  73.             sort(g[i].begin(),g[i].end());
  74.         }
  75.  
  76.         dfs(1,-1);
  77.  
  78.         int idx[n+4]={0},idx1[n+4]={0};
  79.  
  80.         for(int i=0;i<st.size();i++){
  81.             idx[st[i]]=i+1;
  82.             idx1[i+1]=st[i];
  83.         }
  84.  
  85.         int q;
  86.  
  87.         scanf("%d",&q);
  88.         printf("Case %d:\n",cs);
  89.  
  90.         build(1,1,n);
  91.  
  92.         while(q--){
  93.             int c;
  94.             scanf("%d",&c);
  95.             if(c==1){
  96.  
  97.                 scanf("%d %d",&x,&value);
  98.                 int id=idx[x]-cnt[x]+1;
  99.                 //cout<<id<<" id idx "<<idx[x]<<endl;
  100.                 update(1,1,n,id,idx[x]);
  101.             }
  102.             else{
  103.  
  104.                 scanf("%d",&x);
  105.                 printf("%lld\n",ans[x]);
  106.             }
  107.         }
  108.         for(int i=1;i<=n;i++){
  109.             g[i].clear();
  110.             cnt[i]=0;
  111.             ans[i]=0;
  112.         }
  113.         //for(int i=1;i<=4*n;i++)stree[i]=0;
  114.         st.clear();
  115.     }
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement