Pagini recente » Cod sursa (job #2145444) | Cod sursa (job #2412469) | Cod sursa (job #1961358) | Cod sursa (job #900375) | Cod sursa (job #1446450)
#include <fstream>
#include <vector>
using namespace std;
int suma_xor_pana_la(const int n){
switch(n%4){
case 0:
return n;
case 1:
return 1;
case 2:
return n+1;
case 3:
return 0; } }
void make_padure(const vector<vector<int> >& copii, const vector<int>& al_catelea,
vector<vector<int> >& padure, const int cur, vector<int>& in_spate){
if(al_catelea[cur] != 0){
const int stramos = in_spate[in_spate.size()-al_catelea[cur]];
padure[stramos].push_back(cur); }
in_spate.push_back(cur);
for(const auto next : copii[cur]){
make_padure(copii, al_catelea, padure, next, in_spate); }
in_spate.pop_back(); }
void mark_subarbore(const vector<vector<int> >& padure, vector<int>& rez,
const int adanc, const int cur){
rez[cur] = adanc;
for(const auto x : padure[cur]){
mark_subarbore(padure, rez, adanc+1, x); } }
void citeste_date(vector<vector<int> >& padure, vector<int>& radacini){
ifstream f("cerere.in");
int n;
f >> n;
padure.resize(n);
vector<int> al_catelea(n);
for(int i = 0; i < n; ++i){
f >> al_catelea[i];
if(al_catelea[i] == 0){
radacini.push_back(i); } }
vector<vector<int> > copii(n);
int rad = suma_xor_pana_la(n-1);
for(int i = 1, t, c; i < n; ++i){
f >> t >> c;
--t, --c;
rad ^= c;
copii[t].push_back(c); }
vector<int> in_spate;
make_padure(copii, al_catelea, padure, rad, in_spate); }
int main(){
vector<vector<int> > padure;
vector<int> radacini;
citeste_date(padure, radacini);
vector<int> rez(padure.size());
for(const auto x : radacini){
mark_subarbore(padure, rez, 0, x); }
ofstream g("cerere.out");
for(const auto x : rez){
g << x << ' '; }
return 0; }