Cod sursa(job #1744753)

Utilizator Bodo171Bogdan Pop Bodo171 Data 20 august 2016 13:15:53
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
int s[18][100005],sortop[100005],kk,a,b,i,j,n,k[100005],nr[100005],node,source;
vector<int> v[100005];
bitset<100005> noroot;
void dfs(int x)
{
    kk++;
    sortop[kk]=x;
    for(int i=0;i<v[x].size();i++)
        dfs(v[x][i]);
}
int main()
{
    ifstream f("cerere.in");
    ofstream g("cerere.out");
    f>>n;
    for(i=1;i<=n;i++)
        f>>k[i];
    for(i=1;i<=n-1;i++)
    {
       f>>a>>b;
       v[a].push_back(b);
       s[0][b]=a;
       noroot[b]=1;
    }
    for(i=1;i<=n&&node==0;i++)
        if(!noroot[i])
          node=i;
    dfs(node);
    for(i=1;i<=n;i++)
    {
        node=sortop[i];
        for(j=1;(1<<j)<=n;j++)
        {
            s[j][node]=s[j-1][s[j-1][node]];
        }
        if(k[node]==0) {nr[node]=0;continue;}
        source=node;
        for(j=0;(1<<j)<=k[node];j++)
        {
           if(k[node]&(1<<j))
                source=s[j][source];
        }
        nr[node]=nr[source]+1;
    }
    for(i=1;i<=n;i++)
        g<<nr[i]<<' ';
    return 0;
}