Cod sursa(job #456334)

Utilizator hadesgamesTache Alexandru hadesgames Data 15 mai 2010 10:55:39
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
#define pb push_back
FILE *in,*out;
const int rad=316;
int v[100005],nrb,timp,start[100005],stop[100005],val[100005],b[100005],n,nod[100005];
vector<int> a[100005];
bitset<1000005> cnt[320];
void dfs(int x)
{
	v[x]=1;
	int i;
	timp++;
	stop[x]=start[x]=timp;
	val[timp]=0;
	nod[timp]=x;
	for (i=0;i<a[x].size();i++)
		if (!v[a[x][i]])
		{
			dfs(a[x][i]);
			stop[x]=timp;
		}
}
void regenerez(int t,int x,int y,int x2,int y2,int z)
{
	int i;
	for (i=x;i<=y&&i<=n;i++)
	{
		cnt[t][val[i]]=0;
		val[i]+=z;
	}
	for (i=x2;i<=y2&&i<=n;i++)
		cnt[t][val[i]]=1;
}
void update(int x,int y,int z)
{
	int bx=x/rad+1;
	int startx=(bx-1)*rad;
	int by=y/rad+1;
	int starty=(by-1)*rad;
	int i;
	if (bx==by)
	{
		regenerez(bx,x,y,startx,startx+rad-1,z);
	}
	else
	{
		regenerez(bx,x,startx+rad-1,startx,startx+rad-1,z);
		regenerez(by,starty,y,starty,starty+rad-1,z);
	}
	for (i=bx+1;i<by;i++)
		b[i]+=z;
	
}
int query(int x)
{

	int i,j;
	for (i=1;i<=nrb;i++)
		if (b[i]<=x&&cnt[i][x-b[i]])
		{
			for (j=(i-1)*rad;j<rad*i&&j<=n;j++)
				if (j&&val[j]+b[i]==x)
					return nod[j];
		}
	return -1;
}
int main()
{
	int i,tip,x,y,m;
	in=fopen("arbore.in","r");
	out=fopen("arbore.out","w");
	fscanf(in,"%d%d",&n,&m);
	for (i=1;i<n;i++)
	{
		fscanf(in,"%d%d",&x,&y);
		a[x].pb(y);
		a[y].pb(x);
	}
	dfs(1);
	nrb=n/rad + (n%rad?1:0);
	for (i=1;i<=nrb;i++)
		cnt[i][0]=1;
	for (i=1;i<=m;i++)
	{
		fscanf(in,"%d",&tip);
		if (tip==1)
		{
			fscanf(in,"%d%d",&x,&y);
			update(start[x],stop[x],y);
		}
		if (tip==2)
		{
			fscanf(in,"%d",&x);
			fprintf(out,"%d\n",query(x));
		}
	}
	fclose(in);
	fclose(out);
	return 0;
}