Cod sursa(job #1073190)

Utilizator sebinechitasebi nechita sebinechita Data 5 ianuarie 2014 19:35:14
Problema Cerere Scor 0
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
#define MAX 100100

vector < int > G[MAX];

int tata[MAX], stiva[MAX], sf, a[MAX];
int* x;

void df1(int nod)
{
    stiva[++sf]=nod;
    a[nod]=stiva[sf-a[nod]];

    for(int i=0;i<G[nod].size();i++)
    {
        df1(G[nod][i]);
    }
    sf--;
}

int up(int nod)
{
    if(!x[nod])
    {
        x[nod]=up(a[nod])+1;
    }
}

int main()
{
    sf=-1;
    int n, i;
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>a[i];
    }
    for(i=1;i<n;i++)
    {
        int df, fg;
        fin>>df>>fg;
        G[df].push_back(fg);
        tata[fg]=df;
    }
    int e=1;
    while(tata[e])
        e=tata[e];
    df1(e);
    x=tata;
    for(i=1;i<=n;i++)
    {
        if(a[i]==i)
        {
            x[i]=1;
        }
        else
        {
            x[i]=0;
        }
    }
    for(i=1;i<=n;i++)
    {
        if(!x[i])
        {
            x[i]=up(i);
        }
    }
    for(i=1;i<=n;i++)
    {
        fout<<x[i]-1<<" ";
    }

}