Cod sursa(job #865768)

Utilizator ELHoriaHoria Cretescu ELHoria Data 26 ianuarie 2013 22:56:07
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>

using namespace std;
  
ifstream cin("cerere.in");
ofstream cout("cerere.out");

const int NMAX = 100002, logMax = 17;
int N, K[NMAX], T[NMAX];
int C[NMAX];
int LG[NMAX];
int S[logMax][NMAX];

int query(int node) {
	if(C[node] != -1) {
		return C[node];
	}
	if(K[node] == 0) {
		return C[node] = 0;
	}
	int Q = node, P = K[node];
	for(int l = LG[P];P > 0;) {
		 Q = S[l][Q];
		 P -= (1<<l);
		 l = LG[P];
	}
	return C[node] = 1 + query(Q);
}

int main()
{
	cin>>N;
	for(int i = 1;i <= N;i++) {
		cin>>K[i];
		C[i] = -1;
		LG[i + 1] = LG[(i + 1)>>1] + 1;
	}
	for(int i = 1;i < N;i++) {
		int A, B;
		cin>>A>>B;
		S[0][B] = A;
	}
	for(int i = 1;i < logMax;i++) {
		for(int j = 1;j <= N;j++) {
			S[i][j] = S[i - 1][S[i - 1][j]];
		}
	}
	for(int i = 1;i <= N;i++) {
		cout<<query(i)<<" ";
	}
    return 0;
}