Cod sursa(job #481078)

Utilizator ilincaSorescu Ilinca ilinca Data 30 august 2010 15:13:28
Problema Arbore Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
#include <vector>
#include <bitset>

#define nmax 100005
#define vmax 1000005
#define sq 316

using namespace std;

int n, m, nsq, viz [nmax], pf [nmax], pb [nmax], a [320], k [nmax], e [nmax];
bitset <vmax> v [320];
vector <int> arb [nmax];


void dfs (int w)
{
	viz [w]=1;
	int i;
	e [++e [0]]=w;
	pf [w]=e [0];
	k [w]=0;
	for (i=0; i < arb [w].size (); ++i)
		if (viz [arb [w] [i]] == 0)
			dfs (arb [w] [i]);
	pb [w]=e [0];
}

void set0 (int x, int r1, int r2, int s)
{
	int i, r;
	for (i=x*sq, r=0; r != sq && i <= n; ++i, ++r)
	{
		v [x] [k [i]]=0;		
		if (r >= r1 && r <= r2) k [i]+=s;
	}
	for (i=x*sq, r=0; r != sq && i <= n; ++i, ++r)	v [x] [k [i]]=1;
}

void update (int p, int s)
{
	int x, y, r1, r2, i;
	x=pf [p]/sq;
	r1=pf [p]%sq;
	y=pb [p]/sq;
	r2=pb [p]%sq;
	if (x == y)
		set0 (x, r1, r2, s);
	else
	{
		set0 (x, r1, sq, s);
		set0 (y, 0, r2, s);
		for (i=x+1; i < y; ++i) a [i]+=s;
	}
}
		
int query (int s)
{
	int x, i;
	for (x=0; x < nsq; ++x) 
		if (s >= a [x] && v [x] [s-a [x]])
		{
			for (i=x*sq; i < (x+1)*sq; ++i)
				if (i && k [i] == s-a [x]) return e[i];
		}
	return -1;
}

int main ()
{
	freopen ("arbore.in", "r", stdin);
	freopen ("arbore.out", "w", stdout);
	int i, x, y, tip;
	scanf ("%d%d", &n, &m);
	for (i=1; i < n; ++i)
	{
		scanf ("%d%d", &x, &y);
		arb [x].push_back (y);
		arb [y].push_back (x);
	}
	dfs (1);
	nsq=n/sq + (n%sq? 1:0);
	for (i=1; i <= m; ++i)
	{
		scanf ("%d%d", &tip, &x);
		if (tip == 1)
		{
			scanf ("%d", &y);
			update (x, y);
		}
		else
			printf ("%d\n", query (x));
	}
	return 0;
}