Cod sursa(job #2134513)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 18 februarie 2018 00:08:38
Problema Arbore Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fi("arbore.in");
ofstream fo("arbore.out");

const int N = 1e5 + 5, SQR = 320, VAL = 1e6 + 5;

struct Buck {
	int lazy;
	bitset<VAL> bit; };

int n, m, lpt;

Buck bucks[SQR];
vector<int> g[N];
int value[N], line[N], lst[N], ldr[N];

static void build(int idx) {
	for (int i = idx * SQR; i < idx * SQR + SQR; ++i)
		bucks[idx].bit[value[i]] = 0;
	for (int i = idx * SQR; i < idx * SQR + SQR; ++i)
		bucks[idx].bit[value[i]] = 1; }

static void update(int st, int dr, int val) {
	for (int i = st / SQR + 1; i < dr / SQR; ++i)
		bucks[i].lazy+= val;

	if (st / SQR == dr / SQR) {
		for (int i = st; i <= dr; ++i) {
			bucks[st / SQR].bit[value[i]] = 0;
			value[i]+= val; }
		build(st / SQR);
		return;}

	for (int i = st; i / SQR == st / SQR; ++i) {
		bucks[st / SQR].bit[value[i]] = 0;
		value[i]+= val; }
	for (int i = dr - dr % SQR; i / SQR == dr / SQR && i <= dr; ++i) {
		bucks[dr / SQR].bit[value[i]] = 0;
		value[i]+= val; }

	build(st / SQR);
	build(dr / SQR);
}

static int query(int val) {
	int b = -1;
	for (int i = 0; i <= n / SQR && b == -1; ++i)
		if (val >= bucks[i].lazy && bucks[i].bit[val - bucks[i].lazy])	
			b = i;

	if (b == -1) return -1;

	for (int i = b * SQR; i < (b + 1) * SQR && i < n; ++i)
		if (value[i] + bucks[b].lazy == val)
			return line[i];

	assert(0); }

static void _line(int u = 1, int far = 1) {
	line[lpt] = u;
	lst[u] = lpt++;
	for (auto v: g[u]) if (v != far)
		_line(v, u);
	ldr[u] = lpt - 1; }

int main() {
	int op, nod, s;

	fi >> n >> m;
	for (int a, b, i = 1; i < n; ++i) {
		fi >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a); }

	_line();
	for (int i = 0; i < SQR; ++i)
		bucks[i].bit = 1;

	while (fi >> op) {
		switch(op) {
		case 1: {
			fi >> nod >> s;
			update(lst[nod], ldr[nod], s);
			break; }
		case 2: {
			fi >> s;
			fo << query(s) << '\n';
			break; } } }

	return 0; }