Pagini recente » Cod sursa (job #2571319) | Cod sursa (job #1457450) | Cod sursa (job #2289316) | Cod sursa (job #1390597) | Cod sursa (job #14257)
Cod sursa(job #14257)
#include<stdio.h>
#define fin "cerere.in"
#define fout "cerere.out"
#define Nmax 100001
int n,m,v[Nmax],ret[Nmax],adr[Nmax],list[Nmax][2],gri[Nmax];
int st[Nmax];
FILE *in,*out;
inline void swap (int &a,int &b) { int aux; aux=a; a=b; b=aux; }
void qsort(int st,int dr) {
int i,j,m;
i=st; j=dr;
m=list[(i+j)/2][0];
do {
while (list[i][0]<m) ++i;
while (list[j][0]>m) --j;
if (i<=j) {
swap(list[i][0],list[j][0]);
swap(list[i][1],list[j][1]);
++i; --j;
}
} while (i<j);
if (i<dr) qsort(i,dr);
if (j>st) qsort(st,j);
}
void df(int nod) {
int i,str;
st[++st[0]]=nod;
if (v[nod]!=0) {
str=st[st[0]-v[nod]];
ret[nod]=1+ret[str];
}
for (i=adr[nod];list[i][0]==nod && i<=m;++i)
df(list[i][1]);
st[0]--;
}
int main() {
int i,j,start;
in=fopen(fin,"r"); out=fopen(fout,"w");
fscanf(in,"%i",&n);
for (i=1;i<=n;++i)
fscanf(in,"%i",&v[i]);
for (i=1;i<n;++i) {
int a,b;
fscanf(in,"%i%i",&a,&b);
list[i][0]=a;
list[i][1]=b;
gri[b]++;
}
m=n-1;
qsort(1,m);
for (i=1;i<=m;) {
for(j=i;list[j][0]==list[i][0] && j<=m;++j);
adr[list[i][0]]=i;
i=j;
}
for (i=1;i<=n;++i) if (gri[i]==0) start=i;
v[start]=0;
df(start);
for (i=1;i<=n;++i) {
if (i>1) fprintf(out," ");
fprintf(out,"%i",ret[i]);
}
fprintf(out,"\n");
fclose(in); fclose(out);
return 0;
}