Cod sursa(job #2136183)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 19 februarie 2018 18:44:33
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <vector>
#include <fstream>
#include <algorithm>
#define nmax 100005
using namespace std;

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

vector<int>Q[nmax],topsorted,tobesorted,ancestors;

int n,stramos[nmax],tata[nmax],intel[nmax],prev;

void read()
{
    f>>n;
    for (int i=1; i<=n; ++i)
        f>>stramos[i];
    for (int i=1; i<n; ++i)
    {
        int a,b;
        f>>a>>b;
        Q[a].push_back(b);
        tata[b]=a;
    }
}

void topsort(int nod)
{
    for (auto w:Q[nod])
        topsort(w);
    topsorted.push_back(nod);
}

void solve()
{
    for (int i=1; i<=n; ++i)
        if (!tata[i])
        {
            tata[i]=i;
            tobesorted.push_back(i);
        }
    for (auto w:tobesorted)
        topsort(w);
    reverse(topsorted.begin(),topsorted.end());
    for (auto w:topsorted)
    {
        while (ancestors.size()&&ancestors.back()!=tata[w])
        {
            ancestors.pop_back();
        }
        if (!stramos[w])
        {
            ancestors.push_back(w);
            continue;
        }
        else
        {
            intel[w]=1+intel[ancestors[ancestors.size()-stramos[w]]];
            ancestors.push_back(w);
        }
    }
    for (int i=1; i<=n; ++i)
        g<<intel[i]<<' ';
}

int main()
{
    read();
    solve();
    return 0;
}