Cod sursa(job #633315)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 13 noiembrie 2011 16:06:25
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>
#include <cstdio>
#include <vector>
#define BUFF 7000000
using namespace std;

int ind,n,k[100100],X,Y,rad,ap[100100],sol[100100];
vector<int> A[100100];
char buffer[BUFF+1];

void DFs(int nod,int niv)
{
    ap[niv]=nod;
    if(k[nod]==0)
        sol[nod]=0;
    else
        sol[nod] = sol[ap[niv-k[nod]]]+1;
    for(vector<int>::iterator it=A[nod].begin();it!=A[nod].end();++it)
        DFs(*it,niv+1);
}

inline int take()
{
    int nr=0;
    while(!(buffer[ind]>='0' && buffer[ind]<='9')) ++ind;
    while(buffer[ind]>='0' && buffer[ind]<='9') nr=nr*10+buffer[ind]-'0',++ind;
    return nr;
}

int main()
{
    freopen("cerere.in","r",stdin);
    ofstream g("cerere.out");

    fread(buffer,1,BUFF,stdin);
    n=take();
    for(int i=1;i<=n;++i)
        k[i]=take();

    rad=(n*(n+1))>>1;
    for(int i=1;i<n;++i)
    {
        X=take();Y=take();
        A[X].push_back(Y);
        rad-=Y;
    }

    DFs(rad,1);

    for(int i=1;i<=n;++i)
        g<<sol[i]<<' ';

    g.close();
    return 0;
}