Cod sursa(job #1446450)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 1 iunie 2015 20:58:52
Problema Cerere Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#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; }