Pagini recente » Cod sursa (job #3047800) | Cod sursa (job #3170626) | Cod sursa (job #1513204) | Cod sursa (job #2621171) | Cod sursa (job #3950)
Cod sursa(job #3950)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define fin "stramosi.in"
#define fout "stramosi.out"
#define Nmax 250001
#define logNmax 20
long a[logNmax][Nmax],N,M,b2[1001],r;
FILE *fi,*fo;
long ancestor(long x)
{
long i,u;
for(i=r;i>0;i--)
if(b2[i])
u=a[i-1][x], x=u;
return u;
}
void solve(void)
{
long i,j,k,logN;
fi=fopen(fin,"r"), fo=fopen(fout,"w");
fscanf(fi,"%ld %ld\n",&N,&M);
for(i=1;i<=N;i++) fscanf(fi,"%ld ",&a[0][i]);
logN=ceil(log(N)/log(2));
for(k=1;k<=logN;k++)
for(i=1;i<=N;i++)
a[k][i]=a[k-1][a[k-1][i]];
fscanf(fi,"\n");
for(;M;M--)
{
memset(b2,0,sizeof(b2));
fscanf(fi,"%ld %ld\n",&i,&j);
for(r=0;j;j/=2) b2[++r]=j%2;
k=ancestor(i), fprintf(fo,"%ld\n",k);
}
fcloseall();
}
int main(void)
{
solve();
return 0;
}