Cod sursa(job #608475)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 16 august 2011 19:54:27
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <stdio.h>

#define MaxN 250001
#define MaxM 300001

int sol[MaxM],nodnivel[MaxN];
int radacini[MaxN];

struct intrebare{
	int nP;
	int nr;
	intrebare* prev;
} intrebari[MaxN]; // intrebarile corespunzatoare nodului i

struct fiu{
	int nod;
	fiu *prev;
}fii[MaxN];


void dfs(int nod , int nivel);

int main(int argc, char* argv[])
{
	int M,N;
	int P,Q;
	int i,j;
	int nrrad=0;
	int tata;
	intrebare* auxi;
	fiu* auxf;

	FILE *fpr,*fpw;
	fpr = fopen("stramosi.in","r");
	fpw = fopen("stramosi.out","w");

	fscanf(fpr,"%d %d",&N,&M);
	for(i=1;i<=N;i++){
		fscanf(fpr,"%d",&tata);
		if(tata == 0){
			nrrad++;
			radacini[nrrad] = i;
			continue;
		}
		auxf = new fiu; // stocare arbore pe baza de lista de fii 
		auxf->nod = i;
		auxf->prev = fii[tata].prev;
		fii[tata].prev = auxf;
	}

	for(i=1;i<=M;i++){
		fscanf(fpr,"%d %d",&Q,&P);
		auxi = new intrebare;
		auxi->nP = P;
		auxi->nr = i;
		auxi->prev = intrebari[Q].prev;
		intrebari[Q].prev = auxi;
	}

	for(i=1;i<=nrrad;i++)
		dfs(radacini[i],1);

	for(i=1;i<=M;i++)
		fprintf(fpw,"%d\n",sol[i]);
	
	fclose(fpr);
	fclose(fpw);
	return 0;
}

void dfs(int nod ,int nivel)
{
	nodnivel[nivel] = nod ;
	fiu* f;
	intrebare* i;

	i = intrebari[nod].prev;
	while(i!=NULL){
		if(i->nP < nivel)
			sol[i->nr] = nodnivel[nivel-i->nP];
		else
			sol[i->nr] = 0;
		i = i->prev;
	}

	f = fii[nod].prev;
	while(f!=NULL){
		dfs(f->nod,nivel+1);
		f=f->prev;
	}

}