Pagini recente » Cod sursa (job #1366212) | Cod sursa (job #1547322) | Cod sursa (job #223534) | Cod sursa (job #2109993) | Cod sursa (job #2674815)
#include<bits/stdc++.h>
#define pb push_back
#define maxn 100005
using namespace std;
int maimute, stramos[maxn], nr_maimuta[maxn], lant_maimuta[maxn], lant_anterior[maxn], lungime = 1, nr_lanturi = 1, x, y;
vector <int> fii[maxn], lant_curent;
vector<vector <int> > lant;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
void citeste() {
fin >> maimute;
for (int i = 1; i <= maimute; i++)
fin >> stramos[i];
for (int i = 1; i < maimute; i++) {
fin >> x >> y;
fii[x].pb(y);
}
lant.pb(lant_curent);
}
int gaseste_numar(int maimuta) {
if (stramos[maimuta] == 0)
return 0;
stramos[maimuta]++;
int raspuns = maimuta;
while(stramos[maimuta] > 0) {
if(raspuns == 0)
return 1;
if (stramos[maimuta] >= nr_maimuta[raspuns]) {
stramos[maimuta] -= nr_maimuta[raspuns];
raspuns = lant_anterior[lant_maimuta[raspuns]];
} else {
raspuns = lant[lant_maimuta[raspuns] - 1][nr_maimuta[raspuns] - stramos[maimuta]];
stramos[maimuta] = 0;
}
}
return stramos[raspuns] + 1;
}
void construieste_lanturi(int maimuta) {
lant[nr_lanturi - 1].pb(maimuta);
lant_maimuta[maimuta] = nr_lanturi;
nr_maimuta[maimuta] = lungime;
stramos[maimuta] = gaseste_numar(maimuta);
int nr = 0;
for (auto fiu : fii[maimuta]) {
lungime++;
if(nr++) {
lungime = 1;
nr_lanturi++;
lant_anterior[nr_lanturi] = maimuta;
lant.pb(lant_curent);
}
construieste_lanturi(fiu);
}
}
int main() {
citeste();
construieste_lanturi(1);
for (int i = 1; i <= maimute; i++)
fout << stramos[i] << " ";
}