Cod sursa(job #445202)

Utilizator indestructiblecont de teste indestructible Data 23 aprilie 2010 00:39:46
Problema Arbore Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.38 kb
#include <stdio.h>
#include <vector>
#include <bitset>
#define pb push_back
#define NMAX 100005
#define LMAX 355
#define HMAX 1000005
using namespace std;
int n,m,nr,gr,B[NMAX],C[NMAX],st[NMAX],r;
int D[LMAX],E[NMAX];
vector <int> A[NMAX];
bitset <HMAX> marc[LMAX];
void read()
{
	scanf("%d%d",&n,&m);
	int i,x,y;
	for (i=1; i<n; i++)
	{
		scanf("%d%d",&x,&y);
		A[x].pb(y);
	}
}
int cbin(int val)
{
	int i,step=1<<10;
	for (i=0; step; step>>=1)
		if ((i+step)*(i+step)<=n)
			i+=step;
	return i;
}
void dfs(int nod)
{
	int i,vec;
	st[++r]=nod;
	B[nod]=r;
	for (i=0; i<A[nod].size(); i++)
	{
		vec=A[nod][i];
		dfs(vec);
	}
	C[nod]=r;
}
void update(int x,int y,int val)
{
	int st1,st2;
	if (x%nr==1)
		st1=x/nr+1;
	else
	{
		if (x%nr==0)
			st1=x/nr+1;
		else
			st1=x/nr+2;
	}
	st2=y/nr;
	int i;
	for (i=st1; i<=st2; i++)
		D[i]+=val;
	if (st1<=st2)
	{
		for (i=(st1-2)*nr+1; i<=(st1-1)*nr; i++)
			if (i>0)
				marc[st1-1][E[i]]=0;
		for (i=st2*nr+1; i<=(st2+1)*nr; i++)
			if (st2+1<=gr)
				marc[st2+1][E[i]]=0;
		for (i=x; i<=(st1-1)*nr; i++)
			E[i]+=val;
		for (i=st2*nr+1; i<=y; i++)
			E[i]+=val;
		for (i=(st1-2)*nr+1; i<=(st1-1)*nr; i++)
			if (i>0)
				marc[st1-1][E[i]]=1;
		for (i=st2*nr+1; i<=(st2+1)*nr; i++)
			if (st2+1<=gr)
				marc[st2+1][E[i]]=1;
	}
	else
	{
		if (y % nr==0)
		{
			for (i=(st2-1)*nr+1; i<=st2*nr; i++)
				marc[st2][E[i]]=0;
			for (i=x; i<=y; i++)
				E[i]+=val;
			for (i=(st2-1)*nr+1; i<=st2*nr; i++)
				marc[st2][E[i]]=1;
		}
		else
		{
			for (i=st2*nr+1; i<=(st2+1)*nr; i++)
				marc[st2+1][E[i]]=0;
			for (i=x; i<=y; i++)
				E[i]+=val;
			for (i=st2*nr+1; i<=(st2+1)*nr; i++)
				marc[st2+1][E[i]]=1;
		}
	}
}
int cauta(int x)
{
	int i,j;
	for (i=1; i<=gr; i++)
		if (marc[i][x-D[i]])
		{
			for (j=(i-1)*nr+1; j<=i*nr; j++)
				if (E[j]==x-D[i])
					return st[j];
		}
	return -1;
}
void init()
{
	int i;
	for (i=1; i<=gr; i++)
		marc[i][0]=1;
}
void querys()
{
	int i,tip,x,y;
	for (i=1; i<=m; i++)
	{
		scanf("%d",&tip);
		if (tip==1)
		{
			scanf("%d%d",&x,&y);
			update(B[x],C[x],y);
		}
		else
		{
			scanf("%d",&x);
			printf("%d\n",cauta(x));
		}
	}
}
int main()
{
	freopen("arbore.in","r",stdin);
	freopen("arbore.out","w",stdout);
	read();
	nr=cbin(n);
	gr=(n%nr==0) ? n/nr : n/nr+1;
	dfs(1);
	init();
	querys();
	return 0;
}