Ankit_132

F

Oct 30th, 2023 (edited)
424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.28 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll     long long
  6. #define _test   int _TEST; cin>>_TEST; while(_TEST--)
  7. #define pb     push_back
  8.  
  9. class _sTTs_
  10. {
  11.     public:
  12.     const int N = 5e5+10;int n;ll int *lk, *kl;
  13.     _sTTs_()
  14.     {lk = new ll int[4*N]; kl = new ll int[4*N]; }
  15.  
  16.     void init(vector<ll int> &_c, int n)
  17.     {this->n = n;___lk(_c, n);}
  18.  
  19.     void g(int v, int l, int r)
  20.     {
  21.         if (kl[v]==0)return;
  22.         if (kl[v]!=0)
  23.         {lk[v]+=(r-l+1)*kl[v];
  24.             if (l!=r)
  25.             {kl[v<<1]+=kl[v];kl[v<<1|1]+=kl[v];}
  26.         }kl[v]=0;
  27.     }
  28.  
  29.     void __(int v, int l, int r, vector<ll int> &_c)
  30.     {
  31.         kl[v]=0;if (l==r)
  32.         {lk[v]=_c[l];return;}
  33.         int m=(l+r)>>1;
  34.         __(v<<1,l,m, _c);__(v<<1|1,m+1,r, _c);
  35.         lk[v]=lk[v<<1]+lk[v<<1|1];
  36.     }
  37.  
  38.     void _(int v, int l, int r, int ss, int se, ll int _v)
  39.     {
  40.         g(v,l,r);if (ss>se)return;
  41.         if (l==ss && r==se)
  42.         { lk[v]+=_v*(r-l+1); if (l!=r)
  43.             { kl[v<<1]+=_v; kl[v<<1|1]+=_v; }
  44.             return;
  45.         }
  46.         int m=(l+r)>>1; _(v<<1,l,m,ss,min(se,m),_v);  _(v<<1|1,m+1,r,max(m+1,ss),se,_v);
  47.         lk[v]=lk[v<<1]+lk[v<<1|1];
  48.     }
  49.  
  50.     ll int s(int v, int l, int r, int ss, int se)
  51.     { g(v,l,r);
  52.         if (ss>se) return 0;
  53.         if (l==ss && r == se) return lk[v];
  54.         int m=(l+r)>>1;
  55.         return s(v<<1,l,m,ss,min(se,m)) + s(v<<1|1,m+1,r,max(m+1,ss),se);
  56.     }
  57.  
  58.     void ___lk(vector<ll int> &_c, ll int n)
  59.     { __(1, 0, n-1, _c); }
  60.  
  61.     void _Range(int l, int r, ll int _v)
  62.     {  _(1,0,n-1,l,r,_v); }
  63.  
  64.     ll int _GG(int l, int r)
  65.     { return s(1,0,n-1,l,r); }
  66. };
  67.  
  68. int main()
  69. {
  70.     _sTTs_ sgt;
  71.     _sTTs_ sgt2;
  72.  
  73.     _test
  74.     {
  75.         int n;
  76.         cin>>n;
  77.  
  78.         vector<vector<int>> tree(n+10);
  79.         int sz = 1;
  80.         vector<int> verAdd(n+10);
  81.         vector<vector<pair<int, ll int>>> valAdded(n+5);
  82.  
  83.         for(int q=0, t, v, x; q<n; q++)
  84.         {
  85.             cin>>t;
  86.  
  87.             if(t == 1)
  88.             {
  89.                 cin>>v;
  90.                 tree[v].pb(++sz);
  91.                 verAdd[sz] = q+1;
  92.             }
  93.             else
  94.             {
  95.                 cin>>v>>x;
  96.                 valAdded[v].pb({q+1, x});
  97.             }
  98.         }
  99.  
  100.         vector<int> st(n+10), en(n+10);
  101.         int tm = 1;
  102.  
  103.         function<void(int)> DFS = [&](int u)
  104.         {
  105.             st[u] = en[u] = tm++;
  106.  
  107.             for(auto v: tree[u])
  108.             {
  109.                 DFS(v);
  110.                 en[u] = max(en[u], en[v]);
  111.             }
  112.         };
  113.  
  114.         DFS(1);
  115.  
  116.         vector<ll int> ans(n+10);
  117.         sgt.init(ans, n+10);
  118.         sgt2.init(ans, n+10);
  119.  
  120.         function<void(int)> DFS2 = [&](int u)
  121.         {
  122.             for(auto [t, x]: valAdded[u])
  123.             {
  124.                 sgt._Range(st[u], en[u], x);
  125.                 sgt2._Range(t, t, x);
  126.             }
  127.  
  128.             ans[u] = sgt._GG(st[u], st[u]);
  129.  
  130.             if(u > 1)
  131.                 ans[u] -= sgt2._GG(0, verAdd[u]-1);
  132.  
  133.             for(auto v: tree[u])
  134.                 DFS2(v);
  135.  
  136.             for(auto [t, x]: valAdded[u])
  137.                 sgt2._Range(t, t, -x);
  138.         };
  139.  
  140.         DFS2(1);
  141.  
  142.         for(int i=1; i<=sz; i++)
  143.             cout<<ans[i]<<" ";
  144.         cout<<"\n";
  145.     }
  146. }
Advertisement
Add Comment
Please, Sign In to add comment