Cod sursa(job #2596213)

Utilizator betybety bety bety Data 9 aprilie 2020 14:21:55
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <bits/stdc++.h>

#include <iostream>

#include <fstream>

#include <algorithm>

#include <vector>

#include <cmath>

using namespace std;

int lg[100005],put[17],nex[17][100005],d[100005],str[100005];

bool f[100005];



class InParser
{

private:

    FILE *fin;

    char *buff;

    int sp;



    char read_ch()
    {

        ++sp;

        if (sp == 4096)
        {

            sp = 0;

            fread(buff, 1, 4096, fin);

        }

        return buff[sp];

    }



public:

    InParser(const char* nume)
    {

        fin = fopen(nume, "r");

        buff = new char[4096]();

        sp = 4095;

    }



    InParser& operator >> (int &n)
    {

        char c;

        while (!isdigit(c = read_ch()) && c != '-');

        int sgn = 1;

        if (c == '-')
        {

            n = 0;

            sgn = -1;

        }
        else
        {

            n = c - '0';

        }

        while (isdigit(c = read_ch()))
        {

            n = 10 * n + c - '0';

        }

        n *= sgn;

        return *this;

    }



    InParser& operator >> (long long &n)
    {

        char c;

        n = 0;

        while (!isdigit(c = read_ch()) && c != '-');

        long long sgn = 1;

        if (c == '-')
        {

            n = 0;

            sgn = -1;

        }
        else
        {

            n = c - '0';

        }

        while (isdigit(c = read_ch()))
        {

            n = 10 * n + c - '0';

        }

        n *= sgn;

        return *this;

    }

} in ("cerere.in");

ofstream out("cerere.out");

int stramos(int nod,int dist)
{

    int e=lg[dist];

    while(dist!=0)
    {

        nod=nex[e][nod];

        dist-=put[e];

        e=lg[dist];

    }

    return nod;

}

void fa(int nod)
{

    if(f[nod]==1)
    {

        return;

    }

    if(str[nod]==0)
    {

        f[nod]=1;

        d[nod]=0;

        return;

    }

    int x=stramos(nod,str[nod]);

    fa(x);

    f[nod]=1;

    d[nod]=d[x]+1;

}

int main()

{

    int n,a,b;

    in>>n;

    for(int i=1; i<=n; i++)
    {

        in>>str[i];

    }

    for(int i=1; i<n; i++)
    {

        in>>a>>b;

        nex[0][b]=a;

    }

    put[0]=1;

    for(int i=1; i<=16; i++)
    {

        put[i]=put[i-1]*2;

        lg[put[i]]++;

    }

    for(int i=1; i<=100000; i++)
    {

        lg[i]+=lg[i-1];

    }

    for(int i=1; i<=16; i++)
    {

        for(int j=1; j<=n; j++)
        {

            nex[i][j]=nex[i-1][nex[i-1][j]];

        }

    }

    for(int i=1; i<=n; i++)
    {

        fa(i);

        out<<d[i]<<" ";

    }

    return 0;

}