Cod sursa(job #1536849)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 26 noiembrie 2015 18:42:11
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<fstream>
#include<vector>
#include<iostream>

using namespace std;

ifstream f("cerere.in");
ofstream g("cerere.out");

int str[100005], TT[20][100005], Log[100005], sol[100005];
int n, rad;
vector <int> G[100005];

void citire()
{
    int x, y;
    f>>n;
    for(int i=1; i<=n; i++)
        f>>str[i];
    for(int i=1; i<n; i++){
        f>>x>>y;
        TT[0][y] = x;
        G[x].push_back(y);
    }
}

void precalc()
{
    int i, j;

    for(i=2; i<=n; i++)
        Log[i] = Log[i/2] + 1;

    for(i=1; i<=Log[n]; i++)
        for(j=1; j<=n; j++)
            TT[i][j] = TT[i-1][TT[i-1][j]];

    for(i=1; i<=n; i++)
        if(TT[0][i] == 0)
            rad = i;
}

int stramos(int nod, int ance)
{
    int red;
    while(ance){
        red = Log[ance];
        nod = TT[red][nod];
        ance -= (1<<red);
    }
    return nod;
}

void DFS(int nod)
{
    int i, vecin, ance;
    for(i=0; i<G[nod].size(); i++){
        vecin = G[nod][i];
        if(vecin != TT[0][nod]){
            if(str[vecin]){
                ance = stramos(vecin, str[vecin]);
                sol[vecin] = sol[ance] + 1;
            }
        }
    }

    for(i=0; i<G[nod].size(); i++){
        vecin = G[nod][i];
        if(vecin != TT[0][nod]){
            DFS(vecin);
        }
    }
}

void afisare()
{
    for(int i = 1; i<=n; i++)
        g<<sol[i]<<" ";
    g<<"\n";
}

int main()
{
    citire();
    precalc();
    DFS(rad);
    afisare();
    return 0;
}