Cod sursa(job #2940398)

Utilizator divadddDavid Curca divaddd Data 15 noiembrie 2022 14:53:19
Problema Cerere Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <cstdio>
#define NMAX    100002
#define LMAX    20
#define DIMBUFF 4096
using namespace std;
vector<int> v[NMAX];
char buff[DIMBUFF];
int n,x,y,dp[NMAX][LMAX],vf[NMAX],k[NMAX],rad,pp;
/// dp[i][j] = al 2^j-lea stramos al nodului i


FILE *fin = fopen("cerere.in", "r");
ofstream fout("cerere.out");

int numar() {
    int val = 0;
    while(!isdigit(buff[pp])){
        pp++;
        if (pp == DIMBUFF){
            fread(buff, 1, DIMBUFF, fin);
            pp = 0;
        }
    }
    while(isdigit(buff[pp])) {
        val = val*10 + buff[pp] - '0';
        pp++;
        if(pp == DIMBUFF){
            fread(buff, 1, DIMBUFF, fin);
            pp = 0;
        }
    }
    return val;
}

void dfs(int nod){
    for(auto vecin: v[nod]){
        dp[vecin][0] = nod;
        for(int j = 1; j < LMAX; j++){
            dp[vecin][j] = dp[dp[vecin][j-1]][j-1];
        }
        dfs(vecin);
    }
}

int getstramos(int nod, int m){
    /// al m-lea stramos al lui nod
    for(int j = LMAX-1; j >= 0; j--){
        if(m&(1<<j)){ /// are bit-ul j setat
            nod = dp[nod][j];
        }
    }
    return nod;
}

int main()
{
    n = numar();
    for(int i = 1; i <= n; i++){
        k[i] = numar();
    }
    for(int i = 1; i < n; i++){
        x = numar();
        y = numar();
        v[x].push_back(y);
        vf[y] = x; /// refolosesc vf
    }
    for(int i = 1; i <= n; i++){
        if(vf[i] == 0){
            rad = i;
            break;
        }
    }
    memset(vf,0,sizeof(vf));
    dfs(rad);
    for(int i = 1; i <= n; i++){
        int cnt = 0;
        int nod = i;
        while(k[nod] != 0){
            cnt++;
            nod = getstramos(nod, k[nod]);
        }
        fout << cnt << " ";
    }
    return 0;
}