Cod sursa(job #480907)

Utilizator ilincaSorescu Ilinca ilinca Data 30 august 2010 02:26:26
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <cstdio>
#include <cmath>
#include <vector>

#define nmax 100001
#define pmax 200005
#define vmax 1000001
#define sqmax 450

using namespace std;

int n, m, sq, pf [nmax], pb [nmax], a [sqmax], k [pmax], e [pmax];
vector <vector <bool> > v (sqmax, vector <bool> (vmax) );
vector <int> arb [nmax];
vector <bool> viz (nmax);

void dfs (int k)
{
	viz [k]=true;
	int i;
	e [++e [0]]=k;
	for (i=0; i != arb [k].size (); ++i)
		if (viz [arb [k] [i]] == false)
		{
			dfs (arb [k] [i]);
			e [++e [0]]=k;
		}
}

inline void set0 (int x)
{
	int i, r;
	for (i=x+sq, r=0; r != sq; ++i, ++r)
		v [x] [k [i]]=false;		
}

void update (int p, int s)
{
	int i, x, y, r, r1, r2;
	// i/sq imi da bucata de lungime sqrt in care se afla elementul i
	x=pf [p]/sq;
	y=pb [p]/sq;
//fprintf (stderr, "%d %d %d\n", p, x, y);	
	r1=pf [p]%sq;
	r2=pb [p]%sq;
	if (x == y)
	{
		set0 (x);
		for (i=x*sq, r=0; r != sq; ++i, ++r)
		{
			if (i > n)
			{r=sq; continue;}
			if (r >= r1 && r <= r2) k [i] += s;
			v [x] [k [i]]=true;
		}
		return;
	}

	i=x;
	if (r1) ++i;
	for (; i < y; ++i) a [i] += s;
	if (r2 == sq-1) a [y] += s;
//for (i=0;  i <= 4; ++i) fprintf (stderr, "%d ", a [i]);

	if (r1)
	{
		set0 (x);
		for (i=x*sq, r=0; r != sq; ++i, ++r)
		{
			if (i > n)
			{r=sq; continue;}
			if (r >= r1) k [i] += s;
			v [x] [k [i]]=true;
		}
	}

	if (r2 != sq-1)
	{
		set0 (y);
		for (i=y*sq, r=0; r != sq; ++i, ++r)
		{
			if (i > n)
			{r=sq; continue;}
			if (r <= r1) k [i] += s;
			v [x] [k [i]]=true;
		}
	}
//for (i=0; i <= n; ++i) fprintf (stderr, "%d %d\n", i, k [i]);
}

int query (int p)
{
	int i, x, r;
	for (x=0; x <= sq+1; ++x) if (p >= a [x] && v [x] [p-a [x]] == true) break;
	if (x == sq+2) return -1;
	for (i=x*sq, r=0; r != sq; ++i, ++r)	
		if (k [i] == p - 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);
	n=e [0];
	sq=sqrt (n);	
	for (i=1; i <= n; ++i)
	{
		pb [e [i]]=i;
		if (pf [e [i]] == 0) pf [e [i]]=i;
	}
	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;
}