Cod sursa(job #29291)

Utilizator AlexMacoMacovei Alexandru AlexMaco Data 8 martie 2007 21:03:45
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int *v,**fii,*nfii,sum;
void pay(int x){
	v[x]+=sum;
	for (int i=0;i<nfii[x];++i)
		pay(fii[x][i]);
}
int search(int x){
	int i,a;
	for (i=0;i<nfii[x];++i)
		if (v[fii[x][i]]==sum) return fii[x][i];
	for (i=0;i<nfii[x];++i){
		if (v[fii[x][i]]<sum)
			if (a=search(fii[x][i]))
				return a;
	}
	return 0;
}
int main (){
	int n,m,i,p,q,tip;
	freopen("arbore.in","r",stdin);
	freopen("arbore.out","w",stdout);
	scanf("%d %d",&n,&m);
	fii=(int **)malloc(sizeof(int *) * (n+1));
	v=(int *)malloc(sizeof(int) * (n+1));
	nfii=(int *)malloc(sizeof(int) * (n+1));
	memset(fii,0,sizeof(fii[0])*(n+1));
	memset(nfii,0,sizeof(nfii[0])*(n+1));
	memset(v,0,sizeof(v[0])*(n+1));
	for (i=1;i<n;++i){
		scanf("%d %d",&p,&q);
		if (!fii[p]){
			fii[p]=(int *)malloc(sizeof(int));
			nfii[p]=1;
		}
		else realloc(fii[p],++nfii[p]*sizeof(fii[0][0]));
		fii[p][nfii[p]-1]=q;
	}
	for (i=1;i<=m;++i){
		scanf("%d",&tip);
		if (tip==1){
			scanf("%d %d",&p,&sum);
			pay(p);
		}
		else{
			scanf("%d",&sum);
			if (v[1]==sum) printf("1\n");
			else printf("%d\n",search(1));
		}
	}
	return 0;
}