Advertisement
Guest User

D. Water in Tree

a guest
Feb 27th, 2020
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 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. void dfs(int u,int par){
  9.     cnt[u]=1;
  10.     for(int v:g[u]){
  11.         if(v==par) continue;
  12.         dfs(v,u);
  13.         cnt[u]+=cnt[v];
  14.     }
  15.     st.pb(u);
  16. }
  17. int main(){
  18.     int t,n,x,y;
  19.     scanf("%d",&t);
  20.     for(int cs=1;cs<=t;cs++){
  21.         scanf("%d",&n);
  22.         for(int i=1;i<n;i++){
  23.             scanf("%d %d",&x,&y);
  24.             g[x].pb(y);
  25.             g[y].pb(x);
  26.         }
  27.         for(int i=1;i<=n;i++){
  28.             sort(g[i].begin(),g[i].end());
  29.         }
  30.         dfs(1,-1);
  31.         int idx[n+4]={0},idx1[n+4]={0};
  32.         for(int i=0;i<st.size();i++){
  33.             idx[st[i]]=i+1;
  34.             idx1[i+1]=st[i];
  35.         }
  36.         int q;
  37.         scanf("%d",&q);
  38.         int ans[n+3]={0};
  39.         set<int> s;
  40.         for(int i=1;i<=n;i++) s.insert(i);
  41.         printf("Case %d:\n",cs);
  42.         while(q--){
  43.             int c;
  44.             scanf("%d",&c);
  45.             if(c==1){
  46.                 scanf("%d %d",&x,&y);
  47.                 int id=idx[x]-cnt[x]+1;
  48.                 if(s.size()){
  49.                     auto lb=s.lower_bound(id);
  50.                     int mxadd=min(idx[x]-(*lb)+1,y);
  51.                     if(mxadd>0){
  52.                         ll cnt1=0;
  53.                         vector<int> temp;
  54.                         for(auto it=lb;it!=s.end();it++){
  55.                             int val=*it;
  56.                             if(val>idx[x] || cnt1>=mxadd){
  57.                                 break;
  58.                             }
  59.                             cnt1++;
  60.                             temp.pb(val);
  61.                             ans[idx1[val]]=1;
  62.                         }
  63.                         for(int it:temp){
  64.                             s.erase(it);
  65.                         }
  66.                     }
  67.                 }
  68.             }
  69.             else{
  70.                 scanf("%d",&x);
  71.                 printf("%d\n",ans[x]);
  72.             }
  73.         }
  74.         for(int i=1;i<=n;i++){
  75.             g[i].clear();
  76.             cnt[i]=0;
  77.         }
  78.         st.clear();
  79.     }
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement