Cod sursa(job #1568191)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 13 ianuarie 2016 22:41:25
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <bitset>

#define DIM 100010

using namespace std;

ifstream fin("arbore.in");
ofstream fout("arbore.out");

int n, m, root;

vector<int> L[DIM];

int position;

int parc[DIM], start[DIM], finish[DIM];

bool vis[DIM];

int v[DIM], add[350];

bitset<1000010> ok[350];

void DFS(int node) {

	vis[node] = true;

	parc[++position] = node;

	start[node] = position;

	for (int i = 0; i < L[node].size(); i++) {

		int child = L[node][i];

		if (!vis[child])
			DFS(child);

	}

	finish[node] = position;

}

void update(int node, int sum) {

	int Start = start[node];
	int Finish = finish[node];

	int SR = (Start - 1) / root + 1;
	int SF = (Finish - 1) / root + 1;

	if ((SR - 1) * root + 1 < Start) {

		for (int i = (SR - 1) * root + 1; i <= SR * root; i++) {

			ok[SR][v[i]] = 0;

			v[i] += add[SR];

			if (i >= Start)
				v[i] += sum;

			if (i <= n)
				ok[SR][v[i]] = 1;

		}

		add[SR] = 0;
		SR++;

	}

	if (SF * root > Finish) {

		for (int i = (SF - 1) * root + 1; i <= SF * root; i++) {

			ok[SF][v[i]] = 0;

			v[i] += add[SF];

			if (i <= Finish)
				v[i] += sum;

			if (i <= n)
				ok[SF][v[i]] = 1;

		}

		add[SF] = 0;
		SF--;

	}

	for (int i = SR; i <= SF; i++)
		add[i] += sum;

}

int query(int sum) {

	for (int i = 1; i <= root; i++) {
		
		if (sum - add[i] < 0)
			continue;

		if (ok[i][sum - add[i]]) 
			for (int j = (i - 1) * root + 1; j <= i * root; j++) 
				if (v[j] + add[i] == sum) 
					return parc[j];
			
	}

	return -1;

}

int main() {

	fin >> n >> m;

	root = sqrt(n * 1.0);

	for (int i = 1; i <= root; i++)
		ok[i][0] = 1;

	for (int i = 1; i < n; i++) {

		int x, y;

		fin >> x >> y;

		L[x].push_back(y);
		L[y].push_back(x);

	}

	DFS(1);

	while (m--) {

		int op;

		fin >> op;

		if (op == 1) {

			int node, sum;

			fin >> node >> sum;

			update(node, sum);

			continue;

		}

		int sum;

		fin >> sum;

		fout << query(sum) << "\n";

	}

	return 0;

}

//Miriam e tare!