Cod sursa(job #2541504)

Utilizator AACthAirinei Andrei Cristian AACth Data 8 februarie 2020 15:07:24
Problema Cerere Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("cerere.in");
ofstream g("cerere.out");
int n;
int k[100001];
int parent[100001];
int who[100001];
int cnt[100001];
//vector < int > v[100001];
queue < int > c;
bool viz[100001];
//void bfs(int start)
//{
//    c.push(start);
//    while(!c.empty())
//    {
//        int nod=c.front();
//        c.pop();
//        if(viz[nod]==0)
//        {
//            viz[nod]=1;
//            cnt[nod]=cnt[who[nod]]+1;
//            for(auto nod_m : v[nod])
//                c.push(nod_m);
//        }
//    }
//}
int s[30000][21];
void init()
{
    int i,j;
    for(i=1;i<=n;i++)
        s[i][0]=parent[i];
    for(j=1;j<=20;j++)
    for(i=1;i<=n;i++)
        s[i][j]=s[s[i][j-1]][j-1];
       // afis();
}
void afis()
{
    int i,j;
        for(j=0;j<=20;j++,cout<<'\n')
    for(i=1;i<=n;i++)
        cout<<s[i][j]<<' ';

}
int get_who(int nod, int p)
{
    int power=0;
    while(p)
    {
        if(p%2!=0)
        nod=s[nod][power];
        ++power;
        p/=2;
    }
    return nod;
}
int main()
{
f>>n;
int i;
for(i=1;i<=n;i++)
        f>>k[i];
for(i=1;i<=n-1;i++)
{
    int n1,n2;
    f>>n1>>n2;
//    v[n1].push_back(n2);
    parent[n2]=n1;
}
int root;
init();
    for(i=1;i<=n;i++)
    {
        if(parent[i]==0)
            root = i;
        who[i]=get_who(i,k[i]);
    }





for(i=1;i<=n;i++)
{
    int cont=0;
    int nod=i;
    while(k[nod]!=0)
    {
        nod=who[nod],++cont;
        if(cnt[nod]!=-1)
        {
            cont+=cnt[nod];
            break;
        }
    }
        cnt[i]=cont;
    g<<cont<<' ';

}
return 0;
}