Cod sursa(job #553431)

Utilizator n3msizN3msiz n3msiz Data 14 martie 2011 00:36:51
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<stdio.h>
#include<vector>
#define nmax 100010
#include<algorithm>
using namespace std;
int n,m,i,z,j,x,y,nr;
int tata[nmax];

struct punct{
	int v,t,p,pas,pc;
};
punct T[nmax];

int cmp(punct a,punct b){
	if(a.t==b.t)
		return a.p<b.p;
	else
		return a.t<b.t;
	
}
int cmpp(punct a, punct b){
	return a.p<b.p;
}

int main(){
	FILE*f=fopen("cerere.in","r");
	FILE*g=fopen("cerere.out","w");
	fscanf(f,"%d",&n);
	for(i=1;i<=n;i++){
		fscanf(f,"%d",&T[i].v);
	}
	for(i=1;i<n;i++){
		fscanf(f,"%d %d",&x,&y);
		T[y].t=x;
		tata[y]=x;
	}
	for(i=1;i<=n;i++)
		T[i].p=i;
	
	sort(T+1,T+n+1,cmp);
	
	for(i=1;i<=n;i++)
		T[T[i].p].pc=i;
	
	for(i=1;i<=n;i++){
		if(T[i].v==0)
			T[i].pas=0;
		else{
			z=T[i].v;
			m=i;
			while(z){
				m=T[T[m].pc].t;
				z--;
			}
			if(T[T[m].pc].pas==0)
				T[i].pas=1;
			else
				T[i].pas=T[m].pas+1;
		}
	
	}
	sort(T+1,T+n+1,cmpp);
	for(i=1;i<=n;i++)
		fprintf(g,"%d ",T[i].pas);
		
	fclose(f);
	fclose(g);
	return 0;
}