Cod sursa(job #90589)

Utilizator znakeuJurba Andrei znakeu Data 9 octombrie 2007 19:19:36
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <stdlib.h>

struct fuck	
{
	int x,y;	
};
fuck v[100005];
int v1[100005];
int v2[100005];
int v3[100005];
int v4[100005];
int n,m;

int comp(const void *a, const void *b)
{
	fuck *aa=(fuck*) a, *bb=(fuck*) b;
	fuck x=*aa, y=*bb;
	if (x.x<y.x)
		return -1;
	if (x.x>y.x)
		return 1;
	return 0;
}

void give(int x, int y)
{
	int i;
	v1[x]+=y;
	for (i=v2[x]; i<v3[x]; i++)
		give(v4[i],y);	
}

int main()
{
	int i,j,x,y,tx=0;
	FILE *in=fopen("arbore.in","r");
	FILE *out=fopen("arbore.out","w");
	
	fscanf(in,"%d%d",&n,&m);	
	for (i=1; i<n; i++)
		fscanf(in,"%d%d",&v[i].x,&v[i].y);
	qsort(v,n,sizeof(v[0]),comp);
	for (i=1; i<n; i++)
	{
		x=v[i].x;	y=v[i].y;
		v4[i]=y;
		if (x!=tx)
		{
			v3[tx]=i;
			v2[x]=i;
			tx=x;			
		}
	}
	v3[tx]=i;
	
	
	for (i=0; i<m; i++)
	{
		fscanf(in,"%d",&tx);
		if (tx==1)
		{
			fscanf(in,"%d%d",&x,&y);
			give(x,y);
		}
		else
		{
			fscanf(in,"%d",&x);
			j=1;
			while (v1[j]!=x && j<=n )
				j++;
			if (j<=n)
				fprintf(out,"%d\n",j);
			else
				fprintf(out,"-1\n");			
		}
	}
	
	fclose(in);
	fclose(out);
	return 0;
}