Cod sursa(job #1223013)

Utilizator vendettaSalajan Razvan vendetta Data 25 august 2014 04:56:07
Problema Arbore Scor 20
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.08 kb
#include <iostream>
#include <vector>
#include <set>
#include <unordered_map>
#include <map>
using namespace std;

const int NMAX = 100002;

vector<int> gf[NMAX];
int f[NMAX], l[NMAX], seq[NMAX], length = 0, value[NMAX], add[NMAX];
vector< pair<int,int> > bucket;
multiset<int> mySet[318];
map<int,int>myMap[318];
int used[NMAX];
int n, m, sqrtN;

void dfs(int node){
	used[node] = 1;
	f[node] = ++length;
	seq[length] = node;
	for(int i=0; i<gf[node].size(); ++i){
		if (used[gf[node][i]] == 0){
			dfs(gf[node][i]);
		}
	}
	l[node] = length;
}

int main() {
	freopen("arbore.in", "r", stdin);
	freopen("arbore.out", "w", stdout);
	cin >> n >> m;
	for(int i=1; i<n; ++i){
		int x, y; 
		cin >> x >> y;
		gf[x].push_back(y);
		gf[y].push_back(x);
	}
	dfs(1);
	sqrtN = 1;
	for(; sqrtN*sqrtN <= n; ++sqrtN);
	for(int i=1; i<=n; i+=sqrtN){
		bucket.push_back( make_pair(i, min(n,i+sqrtN-1) ) );
	}
	for(int i=0; i<bucket.size(); ++i){
		for(int j=bucket[i].first; j<=bucket[i].second; ++j){
			//mySet[i].insert(0);
			myMap[i][0]++;
		}
	}
	for(int i=1; i<=m; ++i){
		int tip; 
		cin >> tip;
		if (tip == 1){
			int s, p;
			cin >> p >> s;
			for(int i=0; i<(int)bucket.size(); ++i){
				if ( bucket[i].first > l[p] || bucket[i].second < f[p] ) continue;
				if ( bucket[i].first >= f[p] && bucket[i].second <= l[p]  ){
					add[i] += s;
					continue;
				}
				for(int j=max(bucket[i].first, f[p]); j<=min(bucket[i].second, l[p]); ++j){
					//mySet[i].erase(mySet[i].find( value[seq[j]] ));
					myMap[i][ value[seq[j]] ]--;
					value[seq[j]] += s; 
					myMap[i][ value[seq[j]] ]++;
					//mySet[i].insert( value[seq[j]] );
				}
			}
		}else{
			int s;
			cin >> s;
			bool gasit = false;
			for(int i=0; i<(int)bucket.size(); ++i){
				//multiset<int>::iterator it = mySet[i].find(s-add[i]);
				//if (it == mySet[i].end()) continue;
				if (myMap[i][s-add[i]] == 0) continue;
				gasit = true;
				for(int j=bucket[i].first; j<=bucket[i].second; ++j){
					if (value[ seq[j] ] + add[i] == s){
						cout << seq[j] << "\n";
						break;
					}
				}
				break;
			}
			if (!gasit) cout << -1 << "\n";
		}
	}
	
	return 0;
}