Advertisement
Guest User

D. Water in Tree

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