Cod sursă (job #143336)

Utilizator avatar spatarel Spatarel Dan-Constantin spatarel IP ascuns
Problemă Rafaela (lot liceu) Compilator cpp | 2,08 kb
Rundă Status evaluat
Dată 18 apr. 2015 01:23:34 Scor ascuns
#include<fstream>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<time.h>
#include<set>

using namespace std;

#define MAXSIZE 100005

int sum[MAXSIZE], sw[MAXSIZE], value[MAXSIZE], n , m, total_sum; 
int father[MAXSIZE];
vector<int> arb[MAXSIZE];
int sol_muchie ; 
set<int > responses[100005];

ifstream f("rafaela.in");
ofstream g("rafaela.out");
 
void update (int nod, int val) {
	total_sum += val;
	for (;nod; sum[nod] += val, nod = father[nod]);
}

int get_sol(int nod ) {
	 int maxim = total_sum - sum[nod];
	 sol_muchie = 0;
	 for (vector<int> :: iterator it = arb[nod].begin(); it < arb[nod].end(); it++)
		 if (*it != father[nod]) {
			 maxim = max(maxim, sum[*it]);
			 if ( maxim == sum[*it])
				 sol_muchie = *it;
		 }
	 return maxim;
}

void solve_queryes() {
    char op;
	int tip, nod;
	total_sum = sum[1];

	for(;m;m--) {
		f >> op;
		if ( op == 'Q') {
			f >> nod;
			g << get_sol(nod) << endl;
            responses[nod].insert(sol_muchie);
		} else {
			f >> tip >> nod;
			update(nod, tip);
		}

	}

	int nr_app[5];
	int up_muchii = 0;
	memset(nr_app, 0, sizeof(nr_app));
	for (int i= 1 ; i<= n; i++) {
		if (responses[i].size() > 0 && *(responses[i].begin()) == 0)
			up_muchii ++;
		if (responses[i].size() < 4)
			nr_app[responses[i].size()] ++;
		else
			nr_app[4]++;
	}
	cout << nr_app[0] << ' ' << nr_app[1]<< ' ' << nr_app[2] << ' '<< nr_app[3] << ' ' << nr_app[4]<<endl;
    cout << up_muchii<< endl; 
}

void initial_df(int nod){
	sw[nod] = 1;
	sum[nod] = value[nod];
	for (vector<int> :: iterator it = arb[nod].begin(); it<arb[nod].end(); it++)
		if (sw[*it] == 0) {
			father[*it] = nod;
			initial_df(*it);
			sum[nod] += sum[*it];
		}
}

void init_father(){
	father[1] =0;
	memset(sw, 0, sizeof(sw));
	initial_df(1);
}

void citire(){
	int i, j;
	f >> n >> m;
	for (int i = 1; i < n ; i++) {
		int x, y;
		f >> x >> y;
		arb[x].push_back(y);
		arb[y].push_back(x);
	}

	for (int i = 1 ; i<= n ; i++) {
		f>>value[i];
	}

}

int main(){
	citire();
    init_father();
	solve_queryes();
	f.close();
	g.close();
	return 0;
}