Cod sursa(job #3164257)

Utilizator mdayAyabakti Muhammed Melih mday Data 2 noiembrie 2023 15:58:22
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>   
#include <vector>
#include <bitset>

std::ifstream fin("cerere.in");
std::ofstream fout("cerere.out");

const int N = 1e5 + 1;

std::bitset<N> not_root, used;

std::vector<std::vector<int>> graf;
std::vector<int> stiva;

int n, stramos[N], ans[N];

void dfs(int nod, int h) {
    used[nod] = 1;
    stiva.emplace_back(nod);
    ans[nod] = 1 + ans[stiva[h - stramos[nod]]];
    for(int next : graf[nod])
	if(!used[next])
	    dfs(next, h + 1);
    stiva.resize(stiva.size() - 1);
}

int main() {
    fin >> n;

    graf.assign(n + 1, std::vector<int>());

    for(int i = 1; i <= n; ++i) {
	fin >> stramos[i];
	ans[i] = -1;
    }

    for(int i = 1; i <= n; ++i) {
	int x, y;
	fin >> x >> y;
	not_root[y] = 1;
	graf[x].emplace_back(y);
	graf[y].emplace_back(x);
    }

    for(int i = 1; i <= n; ++i)
	if(!not_root[i]) {
	    dfs(i, 0);
	    break;
	}

    for(int i = 1; i <= n; ++i)
	fout<<ans[i]<<' ';

    graf.clear();
    stiva.clear();
    fin.close();
    fout.close();

    return 0;
}