Codeforces Gym - 101147J Whistle's New Car

Discription

Statements

Whistle has bought a new car, which has an infinite fuel tank capacity.

He discovered an irregular country since it has n cities and there are exactly n - 1roads between them, of course, all cities are connected. He is so much clever, he realized that the country is like a rooted tree of n nodes and node 1 is the root. Each city i has only one filling station by which he can fill his car's fuel tank in no more than Xi liter. Whistle liked the country very much, and he wants to know what the most attractive city in the country is. The attractiveness of the city i is defined by how much it’s reachable from other cities, in other words the attractiveness of city is the number of cities j that satisfies these condition:

  • City j is in the subtree of city i (except for city i itself).
  • Whistle will start at city j and will only fill his car’s fuel tank with Xjliters and never fill it again until he reach city i.
  • Whistle should be able to reach city i with non-negative fuel.

He knows the length of every road and that 1 Km will take exactly 1 liter on any road.

As you know, Whistle is very clever, but he is not that good at programming, so he asked you to help him. He wants to know the attractiveness of each city, so that he can decide which city to live in.

Input

The first line of input contains one integer T, the number of test cases.

The next line contains one integer (1 ≤ n ≤ 500, 000), The number of cities in the country.

The next line contains n integers (1 ≤ Xi ≤ 1, 000, 000, 000).

Each one of the next n - 1 line contains three integers ABC (1 ≤ A, B ≤ n and 1 ≤ C ≤ 1, 000, 000, 000), that means there is a road between city A and city B of length C.

Output

For each test case, output a line containing n integers, the attractiveness of each city.

Example

Input
1
4
5 10 5 10
1 2 100
2 3 5
3 4 5
Output
0 2 1 0

Note

Large I/O files. Please consider using fast input/output methods.

 

    (Why is the file input standard output hhhh, it has been pitted for a long time...)

    Each point maintains a small root heap, and when merging the father on the tree, the heap must be marked with -val_to_fa. Because merging and marking machines are involved, let's just write a left-biased tree.

    The answer for each point at the end is the left-biased tree size of this point -1.

 

    There is also a tree section method for this question. Although it is very good to think (just consider the upward influence of each point directly), but because it runs too slowly, it is blown up by my parallel stack hhhhh

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=500005;
int to[maxn*2],ne[maxn*2],val[maxn*2],num;
int siz[maxn],hd[maxn],L[maxn],ans[maxn];
int n,T,f[maxn],lc[maxn],rc[maxn];
ll W[maxn],tag[maxn];
inline void add(int x,int y,int z){ to[++num]=y,ne[num]=hd[x],hd[x]=num,val[num]=z;}
inline int read(){
	int x=0; char ch=getchar();
	for(;!isdigit(ch);ch=getchar());
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
	return x;
}
void Wt(int x){ if(x>=10) Wt(x/10); putchar(x%10+'0');}
inline void init(){ num=0,memset(hd,0,sizeof(hd));}
inline void update(int x,ll y){ tag[x]+=y,W[x]+=y;}
inline void pushdown(int x){
    if(tag[x]){
	    if(lc[x]) update(lc[x],tag[x]);
	    if(rc[x]) update(rc[x],tag[x]);
		tag[x]=0;
	}
}

int merge(int x,int y){
	if(!x||!y) return x+y;
	pushdown(x),pushdown(y);
	
	if(W[x]>W[y]) swap(x,y);
	rc [x] = merge (rc [x], y), f [rc [x]] = x;
	if(L[rc[x]]>L[lc[x]]) swap(lc[x],rc[x]);
	L [x] = L [rc [x]] + 1, you [x] = you [lc [x]] + you [rc [x]] + 1;
	
	return x;
}

int DEL (int x) {
	pushdown(x),f[lc[x]]=f[rc[x]]=0;
	return merge(lc[x],rc[x]);
}

int dfs (int x, int fa) {
	int root=x,TO;
	for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa){
		TO=dfs(to[i],x),update(TO,-val[i]);
		while(W[TO]<0) TO=DEL(TO);
		root=merge(root,TO);
	}
	
	ans [x] = siz [root] -1;
	return root;
}

int main(){
	freopen("car.in","r",stdin);
//	freopen("data.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		int uu, vv, ww;
		init(),scanf("%d",&n);
		for(int i=1;i<=n;i++) W[i]=read(),tag[i]=lc[i]=rc[i]=L[i]=f[i]=0,siz[i]=1;
		for(int i=1;i<n;i++) uu=read(),vv=read(),ww=read(),add(uu,vv,ww),add(vv,uu,ww);
		dfs(1,-1);
		for(int i=1;i<=n;i++) Wt(ans[i]),putchar(' ');
		puts("");
	}
	return 0;
}

  

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324694324&siteId=291194637