Hydron

Untitled

Apr 3rd, 2022 (edited)
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. using ll = long long;
  6.  
  7. const ll DIM = 1e5+1;
  8.  
  9. vector < ll > g[DIM];
  10. ll timer, tin[DIM], tout[DIM], rnk[DIM], mod[4*DIM];
  11.  
  12. void dfs(ll v, ll p){
  13.     tin[v] = ++timer;
  14.     rnk[tin[v]] = rnk[tin[p]] + 1;
  15.     for (ll to: g[v]){
  16.         if (to != p) dfs(to, v);
  17.     }
  18.     tout[v] = timer;
  19. }
  20.  
  21. #define ver1 v*2+1
  22. #define ver2 ver1+1
  23. #define tm ((tl+tr)>>1)
  24.  
  25. void push(ll v, ll tl, ll tr){
  26.     if (tl == tr || mod[v] == 0) return;
  27.     mod[ver1] += mod[v];
  28.     mod[ver2] += mod[v];
  29.     mod[v] = 0;
  30. }
  31.  
  32. void change(ll v, ll tl, ll tr, ll l, ll r, ll val){
  33.     if (l > r) return;
  34.     if (tl > r || tr < l) return;
  35.     if (tl >= l && tr <= r) mod[v] += val;
  36.     else{
  37.         push(v, tl, tr);
  38.         change(ver1, tl, tm, l, r, val);
  39.         change(ver2, tm+1, tr, l, r, val);
  40.     }
  41. }
  42.  
  43. ll get_rank(ll v, ll tl, ll tr, ll pos){
  44.     if (tl == tr) return rnk[tl] + mod[v];
  45.     push(v, tl, tr);
  46.     if (pos <= tm) return get_rank(ver1, tl, tm, pos);
  47.     else return get_rank(ver2, tm+1, tr, pos);
  48. }
  49.  
  50. int main(){
  51.     ll n;
  52.     cin >> n;
  53.     for (ll i=2; i<=n; i++){
  54.         ll v;
  55.         cin >> v;
  56.         g[v].push_back(i);
  57.     }
  58.     rnk[1] = -1;
  59.     dfs(1, 1);
  60.     ll is_dead[n+1];
  61.     fill(is_dead, is_dead+n+1, 0);
  62.     ll q;
  63.     cin >> q;
  64.     while(q --){
  65.         ll t, x;
  66.         cin >> t >> x;
  67.         if (t == 1){
  68.             if (is_dead[x] == 0){
  69.                 change(0, 1, timer, tin[x]+1, tout[x], -1);
  70.                 is_dead[x] = 1;
  71.             }
  72.         }else{
  73.             if (t == 2){
  74.                 if (is_dead[x] == 1){
  75.                     change(0, 1, timer, tin[x]+1, tout[x], 1);
  76.                     is_dead[x] = 0;
  77.                 }
  78.             }else{
  79.                 cout << get_rank(0, 1, timer, tin[x]) << '\n';
  80.             }
  81.         }
  82.     }
  83. }
  84.  
Add Comment
Please, Sign In to add comment