Cod sursa(job #44248)

Utilizator g3ppyStoian Vlad g3ppy Data 31 martie 2007 00:10:34
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <stdio.h>
#define MAX 250002
#define MIN 20
FILE *fin,*fout;

long w,n,m,o,i,j,a[MAX],p,q,b[MIN][MAX];

int lo(long p)
{long k=0,l=1;
while (p>=l){k++;l*=2;}
return k-1;


}

int main()
{
fin=fopen("stramosi.in","rt");
fout=fopen("stramosi.out","wt");
fscanf (fin,"%ld %ld\n",&n,&m);
for (i=1;i<=n;i++) fscanf (fin,"%ld",&a[i]);
j=1;
w=lo(n);
while (j<=w)
    {
    if (j==1)
       {
       for (i=1;i<=n;i++)
	  b[j][i]=a[a[i]];
       j++;
       }
    else
      {
      for (i=1;i<=n;i++) b[j][i]=b[j-1][b[j-1][i]];
      j++;
      }


    }
for (i=1;i<=m;i++)
    {
    fscanf (fin,"%ld %ld\n",&q,&p);
    if (p<=1)  fprintf(fout,"%ld\n",a[q]);

    else
    {
    w=lo(p);
    q=b[w][q];
    w++;
    while (w<p)
	{
	o=a[q];
	q=o;
	w++;
	if (q==0) break;
	}
    fprintf(fout,"%ld\n",q);}
    }


fcloseall();
return 0;
}