Cod sursa(job #1536940)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 26 noiembrie 2015 19:49:08
Problema Cerere Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<fstream>
#include<cstdio>
#include<vector>
#include<iostream>

using namespace std;

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

int str[100005], TT[20][100005], Log[100005], sol[100005];
int n, rad;
vector <int> G[100005];
char Buffer[100000];
int Buffer_Size = 100000;
int Pos = 0;
/*
void Citeste(int & Nr)
{
    Nr = 0;
    while(Buffer[Pos]<'0' || Buffer[Pos]>'9')
        {
        Pos++;
        if(Pos == Buffer_Size)
            {
                fread(Buffer,1,Buffer_Size,stdin);
                Pos = 0;
            }

        }


    while(Buffer[Pos]>='0' && Buffer[Pos]<='9')
        {
            Nr = Nr * 10 + Buffer[Pos++] - '0';
            if(Pos == Buffer_Size)
                {
                    fread(Buffer,1,Buffer_Size,stdin);
                    Pos = 0;
                }

        }

}*/

void citire()
{
    freopen("cerere.in","r",stdin);

    int x, y;
    f>>n;
    //Citeste(n);
    for(int i=1; i<=n; i++)
        f>>str[i];
        //Citeste(str[i]);
    for(int i=1; i<n; i++){
        f>>x>>y;
        //Citeste(x); Citeste(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<(int)G[nod].size(); i++){
        vecin = G[nod][i];
        if(str[vecin]){
                ance = stramos(vecin, str[vecin]);
                sol[vecin] = sol[ance] + 1;
        }
    }

    for(i=0; i<(int)G[nod].size(); i++){
        vecin = G[nod][i];
        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;
}