Cod sursa(job #2157865)

Utilizator Constantin.Dragancea Constantin Constantin. Data 9 martie 2018 23:13:03
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>
using namespace std;

int p;
#define dim 10000
char buff[dim];

void read(int &nr){
    nr = 0;
    while (buff[p] < '0' || buff[p] > '9'){
        if (++p == dim) fread(buff, 1, dim, stdin), p = 0;
    }
    while (buff[p] >='0' && buff[p] <='9'){
        nr = nr*10 + buff[p] - '0';
        if (++p == dim) fread(buff, 1, dim, stdin), p = 0;
    }
}

int n, a[100010], ans[100010], pr[100010], nxt[100010];

int get(int q){
    if (ans[q] != -1) return ans[q];
    int nod = q;
    if (nxt[q]) nod = nxt[q];
    else {
        for (int i=1; i<=a[q]; i++) nod = pr[nod];
        nxt[q] = nod;
    }
    ans[q] = 1 + get(nod);
    return ans[q];
}

int main(){
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    read(n);
    for (int i=1; i<=n; i++){
        read(a[i]);
        if (a[i]) ans[i] = -1;
    }
    for (int i=1; i<n; i++){
        int a, b;
        read(a); read(b);
        pr[b] = a;
    }
    for (int i=1; i<=n; i++) cout << get(i) << " ";
    return 0;
}