Advertisement
Joudzouzou

Untitled

May 26th, 2018
945
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.18 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MX = (1<<18);
  4. int n;
  5.  
  6. void upd(int *bit , int x , int V){
  7.     while(x <= n){
  8.         bit[x] += V;
  9.         x += x & (-x);
  10.     }
  11. }
  12. int get(int *bit , int x){
  13.     int ret = 0;
  14.     while(x > 0){
  15.         ret += bit[x];
  16.         x -= x &(-x);
  17.     }
  18.     return ret;
  19. }
  20.  
  21. int bit[MX] , lazybit[MX] , temp[MX];
  22.  
  23. vector < int > in ;
  24.  
  25. vector < pair < int , int > > lazy[MX];
  26.  
  27. int ans[MX];
  28.  
  29. void insert_(int x , int stop , int W){
  30.     upd(bit , x , 1);
  31.     upd(lazybit , x , W);
  32.     lazy[stop].push_back({x , -W});
  33.     in.push_back(x);
  34. }
  35. void clear_sack(){
  36.     for(int j = 0 ; j < in.size() ; j++){
  37.         for(auto pp : lazy[j])
  38.             upd(lazybit , pp.first , pp.second);
  39.         lazy[j].clear();
  40.         ans[in[j]] += get(lazybit , in[j]);
  41.         upd(bit , in[j] , -1);
  42.     }
  43.     in.clear();
  44. }
  45.  
  46. int sz[MX] , maxy[MX] , parent[MX];
  47.  
  48. vector < int > v[MX];
  49.  
  50.  
  51.  
  52. vector < int > paths[MX];
  53.  
  54. void format(){
  55.     clear_sack();
  56.     for(int j = 1 ; j <= n ; j++){
  57.         v[j].clear();
  58.         paths[j].clear();
  59.         maxy[j] = 0;
  60.         parent[j] = 0;
  61.         bit[j] = lazybit[j] = 0;
  62.         temp[j] = ans[j] = 0;
  63.     }
  64. }
  65. void dfslight(int x , int root){
  66.     paths[root].push_back(x);
  67.     for(auto nxt : v[x]){
  68.         if(nxt == parent[x]) continue;
  69.         dfslight(nxt , root);
  70.     }
  71. }
  72. int W[MX];
  73. void dfs(int x , int p){
  74.     ans[x] = 0;
  75.     for(auto nxt : v[x]){
  76.         if(nxt == p || nxt == maxy[x]) continue;
  77.         dfslight(nxt , nxt);
  78.         dfs(nxt , x);
  79.     }
  80.  
  81.     clear_sack();
  82.  
  83.     if(maxy[x])
  84.         dfs(maxy[x] , x);
  85.  
  86.     int stop = in.size();
  87.     for(auto nxt : v[x]){
  88.  
  89.         if(nxt == p || nxt == maxy[x]) continue;
  90.  
  91.         for(auto P : paths[nxt]){
  92.             ans[P] += get(bit , P) * W[x];
  93.         }
  94.  
  95.         for(auto P : paths[nxt])
  96.             insert_(P , stop , W[x]);
  97.     }
  98.  
  99.     reverse(v[x].begin() , v[x].end());
  100.  
  101.     for(auto nxt : v[x]){
  102.         if(nxt == p || nxt == maxy[x]) continue;
  103.         for(auto P : paths[nxt])
  104.             ans[P] += get(temp , P) * W[x];
  105.         for(auto P : paths[nxt])
  106.             upd(temp , P , 1);
  107.     }
  108.     for(auto nxt : v[x]) if(nxt != p && nxt != maxy[x]) for(auto P : paths[nxt]) upd(temp , P , -1);
  109.  
  110.     ans[x] += get(bit , x) * W[x];
  111.  
  112.     insert_(x , in.size() , W[x]);
  113.  
  114.  
  115. }
  116.  
  117. void Pdfs(int x , int p){
  118.     sz[x] = 1;
  119.     for(auto nxt : v[x]){
  120.         if(nxt == p) continue;
  121.         parent[nxt] = x;
  122.         Pdfs(nxt , x);
  123.         sz[x] += sz[nxt];
  124.  
  125.     }
  126.     for(auto nxt : v[x]){
  127.         if(nxt == p) continue;
  128.         if(sz[nxt] > sz[x]/2){
  129.             maxy[x] = nxt;
  130.         }
  131.     }
  132. }
  133.  
  134. void solve(){
  135.     cin>>n;
  136.     format();
  137.     for(int j = 1 ; j <= n ; j++){
  138.         scanf("%d",&W[j]);
  139.     }
  140.     for(int j = 1 ; j <= n ; j++){
  141.         int p;
  142.         scanf("%d",&p);
  143.         if(j == 1) continue;
  144.         v[p].push_back(j);
  145.         v[j].push_back(p);
  146.     }
  147.     Pdfs(1 , -1);
  148.     dfs(1 , -1);
  149.     clear_sack();
  150.     for(int j = 2 ; j <= n ; j++){
  151.         if(j > 2) printf(" ");
  152.         printf("%d",ans[j]);
  153.     }
  154.     puts("");
  155. }
  156. int main(){
  157.     int T;
  158.     cin>>T; while(T--) solve();
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement