Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(linker, "/STACK:66777216")
- #define _CRT_SECURE_NO_WARNINGS
- //#include <bits/stdc++.h>
- //#include <unordered_set>
- //#include <unordered_map>
- #include <functional>
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <fstream>
- #include <cassert>
- #include <iomanip>
- #include <complex>
- #include <cstring>
- #include <cstdio>
- #include <bitset>
- #include <string>
- #include <vector>
- #include <ctime>
- #include <queue>
- #include <stack>
- #include <cmath>
- #include <list>
- #include <set>
- #include <map>
- #define forn(i,n) for(int i = 0; i < (int)(n); ++ i)
- #define for1(i,n) for(int i = 1; i <= (int)(n); ++ i)
- #define fore(i,a,b) for(int i = (int)(a); i <= (int)(b); ++ i)
- #define ford(i,n) for(int i = (int)(n)-1; i >= 0; -- i)
- #define ford1(i,n) for(int i = (int)(n); i >= 1; -- i)
- #define fored(i,a,b) for(int i = (int)(b); i >= (int)(a);--i)
- #define mp make_pair
- #define pb push_back
- #define sz(v) ((int)((v).size()))
- #define all(v) (v).begin(), (v).end()
- #define FOR(i, n) for (int i = 0; i < (n); ++i)
- //#define FORE(it,c) for(__typeof(c).begin() it = (c).begin(); it!=(c).end(); ++it)
- //#define fi first
- //#define se second
- using namespace std;
- typedef unsigned long long ULL;
- typedef long long LL;
- typedef long double LD;
- typedef long long i64;
- typedef unsigned long long u64;
- typedef long double ld;
- typedef vector<bool> vb;
- typedef vector<int> vi;
- typedef vector<vi> vvi;
- typedef pair<int,int> pii;
- typedef pair<LL,LL> pll;
- typedef vector<pii> vpi;
- typedef vector<ld> vd;
- typedef pair<ld,ld> pdd;
- typedef vector<pdd> vpd;
- const int N = 2*10+5, E = 20, L = 200;
- int n, p[ N ], d[ N ];
- vector< vi > graph(N);
- int tin[ N ], tmr, tout[ N ];
- LL P[ N ];
- int pa[ N ][ E+2 ];
- int h[ N ];
- void dfs(int v,LL di){
- for1(i,E-1)
- pa[v][i] = pa[ pa[v][i-1] ][i-1];
- tin[v] = ++ tmr;
- P[v] = di;
- forn(j,sz(graph[v])){
- int to = graph[v][j];
- pa[to][0] = v;
- h[to] = h[v]+1;
- dfs(to,di+d[to]);
- }
- tout[v] = tmr;
- }
- int f[ N ];
- void update(int v,int val){
- for(;v <= tmr;v+=v&(-v))
- f[v]+=val;
- }
- int get(int v){
- int res = 0;
- for(;v;v-=v&(-v))
- res+=f[v];
- return res;
- }
- int Q(int v){
- int res = get(tout[v]);
- if(tin[v]-1)
- res-=get(tin[v]-1);
- return res;
- }
- void ST(int v){
- update(tin[v],1);
- }
- bool parent(int v,int p){
- if(tin[v] <= tin[p] && tout[v] >= tout[p])
- return true;
- return false;
- }
- int ans[ N ];
- LL res[ N ];
- int q[ N ];
- bool mark[ N ];
- int par[ N ];
- int LCA(int a,int b){
- if(parent(a,b))return b;
- if(parent(b,a))return a;
- ford(j,E){
- if(!parent(b,pa[a][j]))
- a = pa[a][j];
- }
- return pa[a][0];
- }
- LL res1[ N ];
- void dfsinit(int v,int it){
- q[v] = 0;
- if(v < it)
- ++ q[v];
- forn(j,sz(graph[v])){
- int to = graph[v][j];
- dfsinit(to,it);
- q[v]+=q[to];
- }
- }
- void dfsinit2(int v, LL val){
- forn(j,sz(graph[v])){
- int to = graph[v][j];
- dfsinit2(to,val+(LL)d[to]*q[to]);
- }
- }
- void init(int it){
- //< it
- dfsinit(0,it);
- dfsinit2(0, 0);
- }
- bool dfsmark(int v){
- int q = 0;
- forn(j,sz(graph[v]))
- q+=dfsmark(graph[v][j]);
- if(q >= 2)
- mark[v] = 1;
- q+=mark[v];
- return q!=0;
- }
- void hetdfs(int v,int p){
- par[v] = p;
- forn(j,sz(graph[v]))
- hetdfs(graph[v][j],mark[v]?v:p);
- }
- LL T[ N ];
- void UP(int i){
- while(i){
- T[i]+=( P[i]-P[ par[i] ] );
- i = par[i];
- }
- }
- LL G(int i){
- LL res = 0;
- while(i){
- res+=T[i];
- i = par[i];
- }
- return res;
- }
- void solve(){
- scanf("%d", &n);
- for(int i = 1; i < n; ++ i){
- scanf("%d%d", &p[i], &d[i]);
- --p[i];
- graph[p[i]].pb(i);
- }
- dfs(0,0);
- int v0 = 0;
- ST(0);
- ans[1] = 0;
- for(int k = 2; k <= n; ++ k){
- res[k] = res[k-1]+P[k-1];
- int v = k-1;
- ST(v);
- if(2*Q(v) < k){
- int to = v;
- ford(j,E){
- int u = pa[to][j];
- if(2*Q(u) < k)
- to = u;
- }
- v = pa[to][0];
- }
- //2*Q(v) >= k lower
- if(2*Q(v0) < k){
- int to = v0;
- ford(j,E){
- int u = pa[to][j];
- if(2*Q(u) < k)
- to = u;
- }
- v0 = pa[to][0];
- }
- if(parent(v,v0))
- v0 = v;
- ans[k] = v0;
- //v0 or v
- }
- for(int it = 0; it < n; it+=L){
- init(it);
- forn(i,n){
- T[i] = 0;
- mark[i] = 0;
- }
- mark[0] = 1;
- for(int i = it;i < n && i < it+L; ++ i){
- //ans[i+1],i
- mark[ ans[i+1] ] = 1;
- mark[ i ] = 1;
- }
- dfsmark(0);
- hetdfs(0,0);
- for(int i = it; i < n && i < it+L; ++ i){
- int k = i+1;
- UP(i);
- LL val = G(i);
- int v = ans[k];
- cout<<res[k]+k*P[v]-2*(res1[v])-2*val<<endl;
- }
- }
- }
- void testgen(){
- FILE * f = fopen("input.txt", "w");
- int T = 10;
- // srand(time(NULL));
- // fprintf(f, "%d\n", n);
- fclose(f);
- }
- int main() {
- #ifdef LOCAL
- // testgen();
- freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- #else
- #define task ""
- // freopen(task".in", "r", stdin);
- // freopen(task".out", "w", stdout);
- #endif
- cout<<fixed;
- cout.precision(15);
- cerr<<fixed;
- cerr.precision(12);
- solve();
- #ifdef LOCAL
- cerr<<"Execution time = "<<clock()/1000.0<<"ms\n";
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement