Cod sursa(job #272362)

Utilizator pascu_iulianPascu Iulian pascu_iulian Data 6 martie 2009 22:02:02
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
/* Stramosi				N<=250.000 		M<=500.000
		se da un arbore partial si m interogari de forma "k x" ( care este al k stramos al lui x)
		
		folosim ideea cu al sqrt(n)-lea stramos
*/

#include <stdio.h>
#include <math.h>

struct nod{ int az; nod* urm;} *G[250001], *RAD;
long pr[250001],prq[250001];
long coda[250001],niv[250001];
long N,M, sq;

void DF( long k, long lvl)
{	
	nod *q;
	coda[lvl]=k;
	niv[k]=lvl;
	if(lvl-sq>0 )	
		prq[k]=coda[lvl-sq];
//	else 		prq[k]=coda[1];
		
	for(q= G[k]; q; q= q->urm)
		DF(q->az, lvl+1);
}

void cauta( long &k, long urc)
{
	long target= niv[k]-urc;
	if( target <1 )
		printf("0\n");
	else 
	{
		if( sq <= urc) 
			for( ;niv[k] > target; k= prq[k]);
		for ( ;niv[k] > target ; k= pr[k];) ;
		printf ("%ld\n", k);
	}
}

int main()
{
	freopen("stramosi.in","r",stdin);
	scanf("%ld %ld", &N, &M);
	long i,a,b;	nod *q;
	
	for( i=1; i<=N; ++i)
	{
		scanf("%ld", &a);
		if(a==0)
		{
			q=new nod;
			q->az= i;
			q->urm= RAD;
			RAD= q;
		}
		else
		{
			pr[i]=a;
			//q=new nod;	q->az=a;	q->urm=G[i];	G[i]=q;
			q=new nod;	q->az=i;	q->urm=G[a];	G[a]=q;
		}
	}
	sq= sqrt(N);
	
	for( q= RAD; q; q= q->urm)
		DF(q->az,1);
	
	//for( i=1; i<=N; ++i) printf("%ld    %ld   %ld     %ld\n", i, pr[i], prq[i] , niv[i]);
	freopen("stramosi.out","w",stdout);
		
	for( i=1; i<=M; ++i)
	{
		scanf("%ld %ld", &a, &b);
		cauta(a,b);
	}

	fclose(stdout);
	return 0;
}