Cod sursa(job #369113)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 27 noiembrie 2009 00:33:13
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("cerere.in");
ofstream fo("cerere.out");
vector<int> G[100010];
int K[100010],rez[100010],st[100010][20],dst[100010],vf=1,N,x,y;
char is[100010];
int stramos(int i,int j,int pw){
	if (j==0) return i;
	while ((1<<pw)>j) --pw;
	return stramos(st[i][pw],j-(1<<pw),pw);
}
void dfs(int nod){
	for (int i=0,vl=1;(1<<i)<=vf;++i,vl*=2) st[nod][i]=dst[vf-vl+1];
	int an=nod,cnt=0;
	while (K[an]) an=stramos(an,K[an],18),++cnt;
	rez[nod]=cnt;
	dst[++vf]=nod;
	for (unsigned int i=0;i<G[nod].size();++i) dfs(G[nod][i]);
	--vf;
}
int main(){
	fi>>N;
	for (int i=1;i<=N;++i) fi>>K[i];
	for (int i=1;i<N;++i){
		fi>>x>>y;
		G[x].push_back(y);
		++is[y];
	}
	for (int i=1;i<=N;++i) if (!is[i])dfs(i);
	for (int i=1;i<=N;++i) fo<<rez[i]<<" ";
	fo<<"\n";fo.close();
	return 0;
}