Pagini recente » Cod sursa (job #2565157) | Cod sursa (job #2877104) | Cod sursa (job #2422485) | Cod sursa (job #1461624) | Cod sursa (job #44244)
Cod sursa(job #44244)
#include <stdio.h>
#define MAX 250002
#define MIN 200
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;
}