Cod sursa(job #783901)

Utilizator matei_cChristescu Matei matei_c Data 4 septembrie 2012 14:30:33
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include<cstdio>
#define maxn 250010
#define maxlog 20
using namespace std;

int log[maxn],n,m,a[maxlog][maxn] ;

int query(int q,int p)
{
	if( p == 0 )
		return q ;
	
	if( q == 0 )
		return 0 ;
	
	q = a[ log[p] ][ q ] ;
	p -= ( 1<< ( log[p] ) ) ;
	
	return query(q,p) ;
}

void rmq()
{
	for(int i=1;i<n;++i)
		for(int j=1;j<=n;++j)
			a[i][j] = a[i-1][ a[i-1][j] ] ;
		
	for(int i=2;i<=n;++i)
		log[i] = log[i>>1] + 1 ;	
}

int main()
{

	freopen("stramosi.in","r",stdin);
	freopen("stramosi.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;++i)
		scanf("%d",&a[0][i]) ;
	
	rmq() ;
	
	for(int i=1;i<=m;++i)
	{
		int p,q ;
		scanf("%d%d",&q,&p) ;
		if(p>n)
			printf("0\n") ;
		else
			printf("%d\n",query(q,p));
	}
	
	return 0;

}