Cod sursa(job #339571)

Utilizator CezarMocanCezar Mocan CezarMocan Data 10 august 2009 13:48:01
Problema Arbore Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.44 kb
#include <cstdio>
#include <bitset>
#include <vector>
#include <math.h>
#define maxn 50010
#define maxs 300

using namespace std;

int n, m, a, b, i, j, sq, tip, p, s, bf;
vector <int> g[maxn];
bitset <maxn> bs[maxs]; //aici tin siru de 1 si 0, daca am sau nu un anumit numar
int add_buc[maxs]; //aici tin cat adun pe fiecare bucata de sqrt
int x[maxn]; //aici tin cat adun pe numerele separate
int pdf[maxn], st[maxn], dr[maxn];
bool viz[maxn];

void df(int nod) {
	int i, fiu;
	if (viz[nod])
		return;
	viz[nod] = 1;
	a++;
	pdf[a] = nod;
	st[nod] = a;

	for (i = 0; i < g[nod].size(); i++) {
		fiu = g[nod][i];
		df(fiu);
	}

	dr[nod] = a;
}

inline void update_bitset(int buc, int stg, int drt, int us, int ud, int s) {
	int i;
	//golesc bitsetul
	for (i = stg; i <= drt; i++)
		bs[buc][x[i]] = 0;
	//parcurg numerele, le updatez
	for (i = us; i <= ud; i++) 
		x[i] += s;
	//refac bitsetu
	for (i = stg; i <= drt; i++)
		bs[buc][x[i]] = 1;
}

inline void get_poz(int poz, int &buc, int &st, int &dr) {
	buc = (poz - 1) / sq + 1;
	st = (buc - 1) * sq + 1;
	dr = buc * sq;
	if (dr > n)
		dr = n;
}

inline void update(int nod, int sum) {
	int stg, drt, buc1, buc2, i;

	get_poz(st[nod], buc1, stg, drt);
//	fprintf(stderr, "%d  %d %d %d\n", nod, buc1, stg, drt);
	update_bitset(buc1, stg, drt, st[nod], drt, sum);

	get_poz(dr[nod], buc2, stg, drt);
//	fprintf(stderr, "%d  %d %d %d\n", nod, buc2, stg, drt);
	if (buc2 != buc1) 
		update_bitset(buc2, stg, drt, stg, dr[nod], sum);

	for (i = buc1 + 1; i < buc2; i++)
		add_buc[i] += sum;
}

int query(int sum) {
	int buc, found = 0, i, st, dr;
	for (i = 1; i <= bf; i++) 
		if (bs[i][sum - add_buc[i]]) {
			found = i;
			break;
		}

	if (found == 0)
		return -1;

	buc = found;
	st = (found - 1) * sq + 1;
	dr = found * sq;

	found = 0;
	for (i = st; i <= dr; i++)
		if (x[i] == sum - add_buc[buc]) {
			found = i;
			break;
		}

	return pdf[found];
}

int main() {
	freopen("arbore.in", "r", stdin);
	freopen("arbore.out", "w", stdout);

	scanf("%d%d", &n, &m);
	sq = (int) sqrt(n);
	get_poz(n, bf, a, b);
	for (i = 1; i <= bf; i++)
		bs[i][0] = 1;

	for (i = 1; i < n; i++) {
		scanf("%d%d", &a, &b);
		g[a].push_back(b);
		g[b].push_back(a);
	}

	a = 0;
	df(1);

/*	for (i = 1; i <= n; i++)
		fprintf(stderr, "%d: %d %d\n", i, st[i], dr[i]);*/

	for (i = 1; i <= m; i++) {
		scanf("%d", &tip);
		if (tip == 1) {
			scanf("%d%d", &p, &s);
			update(p, s);
		}
		else {
			scanf("%d", &s);
			printf("%d\n", query(s));
		}
	}


	return 0;
}