Cod sursa(job #3686)

Utilizator megabyteBarsan Paul megabyte Data 27 decembrie 2006 18:14:46
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <stdlib.h>
#define INF "stramosi.in"
#define OUF "stramosi.out"
#define NMAX 262144
int st[NMAX],sol[300001];
struct nod
{
	int c;
	nod *next;
};
struct nod2
{
	int c,poz;
	nod2 *next;
}*pr;
struct head
{
	nod *p,*q;
}la[NMAX];
struct head2
{
	nod2 *p,*q;
}lk[NMAX];

void dfs(nod *p,int k)
{
	while(p!=NULL)
	{
		st[k]=p->c;
		pr=lk[p->c].p;
		//printf("%d\n",st[k]);
		while(pr!=NULL)
		{
		//	printf("%d ",pr->c);
			if(k>=pr->c) sol[pr->poz]=st[k-(pr->c)];//warning
		          else sol[pr->poz]=0;
			pr=pr->next;
		}
		//printf("\n");
		dfs(la[p->c].p,k+1);
		p=p->next;
	}
}
void tipar(nod2 *p)
{
	while(p!=NULL) {printf("%d_%d ",p->c,p->poz);p=p->next;}
	printf("\n");
}
int main()
{
	int i,n,m,x,k;
	nod *op;
	nod2 *po;
	FILE *in,*out;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	fscanf(in,"%d %d",&n,&m);
	for(i=1;i<=n;i++) {la[i].p=la[i].q=NULL;lk[i].p=lk[i].q=NULL;}
	for(i=1;i<=n;i++)
	{
		op=new nod;
		op->next=NULL;fscanf(in,"%d",&x);
		op->c=i;
		if(la[x].p==NULL){la[x].p=la[x].q=op;}
		else {la[x].q->next=op;la[x].q=op;}
	}
	for(i=1;i<=m;i++)
	{
           fscanf(in,"%d %d",&x,&k);
	   po=new nod2;
	   po->next=NULL;po->c=k;po->poz=i;
	   if(lk[x].p==NULL){lk[x].p=lk[x].q=po;}
	   else {lk[x].q->next=po;lk[x].q=po;};
	}
	dfs(la[0].p,1);
//	for(i=0;i<=n;i++) tipar(lk[i].p);
	for(i=1;i<=m;i++) fprintf(out,"%d\n",sol[i]);
	fclose(in);fclose(out);
	return 0;
}