Cod sursă (job #143335)

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

using namespace std;

#define MAXSIZE 200005

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

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];
	 for (vector<int> :: iterator it = arb[nod].begin(); it < arb[nod].end(); it++)
		 if (*it != father[nod])
			 maxim = max(maxim, sum[*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;
		} else {
			f >> tip >> nod;
			update(nod, tip);
		}

	}
}

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;
}