Cod sursa(job #2135068)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 18 februarie 2018 16:14:24
Problema Cerere Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <bits/stdc++.h>
#define Nmax 100001
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int k[Nmax];
int ans[Nmax];
int LOG2[Nmax];
int t[20][Nmax];
int x;
int str(int x, int y)
{
    if(!(y&(y-1))) return t[LOG2[y]][x];
    return str(t[LOG2[y]][x],y-(1<<LOG2[y]));
}
void solve(int i)
{
    if(ans[i]==-1)
    {
        x=str(i,k[i]);
        solve(x);
        ans[i]=ans[x]+1;
    }
}
int main()
{
    int n,i,j,d;
    bool ok;
    f>>n;
    for(i=2;i<=n;i++)
        LOG2[i]=LOG2[i>>1]+1;
    for(i=1;i<=n;i++)
    {
        f>>k[i];
        if(k[i]) ans[i]=-1;
    }
    for(d=1;d<n;d++)
    {
        f>>i>>j;
        t[0][j]=i;
    }
    for(ok=true,i=1;ok;i++)
    {
        ok=false;
        for(j=1;j<=n;j++)
        {
            t[i][j]=t[i-1][t[i-1][j]];
            if(t[i][j]) ok=true;
        }
    }
    for(i=1;i<=n;i++)
        solve(i);
    for(i=1;i<=n;i++)
        g<<ans[i]<<' ';

    return 0;
}