Cod sursa(job #66440)

Utilizator andrei.12Andrei Parvu andrei.12 Data 18 iunie 2007 15:22:57
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include<stdio.h>
int v[250000], a[250000][31], pt[31];
int poz (int p, int q){
	int li=0, ls=30, x;
	while (li<=ls){
		x=(li+ls)/2;
		if (pt[x]<q&&pt[x+1]>=q)
			return x;
		else
			if (pt[x]<q)
				li=x+1;
			else 
				ls=x-1;
	}
	return -1;
}
int main()
{
	freopen("stramosi.in","r",stdin);
	freopen("stramosi.out","w",stdout);
	int i, j, nrt, t, n, p, q, y, s;
	scanf("%d%d",&n,&t);
	for (i=1;i<=n;i++)
		scanf("%d",&v[i]);
	for (i=1;i<=n;i++)
		a[i][0]=v[i];
	pt[0]=1;
	for (j=1;j<=30;j++){
		for (i=1;i<=n;i++)
			a[i][j]=a[a[i][j-1]][j-1];
		pt[j]=2*pt[j-1];
	}
	for (nrt=1;nrt<=t;nrt++){
		scanf("%d%d",&p,&q);
		s=0;
		while (q!=1){
			y=poz(p,q);
			if (y==-1){
				s=1;
				printf("0\n");
				break;
			}
			p=a[p][y];
			q=q-pt[y];
		}
		if (!s)
			printf("%d\n",v[p]);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}