Pagini recente » Cod sursa (job #2342253) | Istoria paginii runda/cnmnarad2/clasament | Cod sursa (job #1932759) | Cod sursa (job #1660162) | Cod sursa (job #777148)
Cod sursa(job #777148)
#include <fstream>
#include <cstdio>
#define N 250010
#define L 20
using namespace std;
FILE* fin=fopen("stramosi.in","r");
FILE* fout=fopen("stramosi.out","w");
const int maxb=8192;
char buf[maxb];
int ptr=0;
inline int GetInt()
{
int nr=0;
while(buf[ptr]<'0'||'9'<buf[ptr])
if (++ptr>=maxb) fread(buf,maxb,1,fin),ptr=0;
while ('0'<=buf[ptr]&&buf[ptr]<='9')
{
nr=nr*10+buf[ptr]-'0';
if (++ptr>=maxb) fread(buf,maxb,1,fin),ptr=0;
}
return nr;
}
int n,i,j,m,p,q;
int D[L][N],Log[N];
bool PW[N];
int Solve (int lvl, int nod)
{
if (lvl==0) return nod;
if (PW[lvl])
return D[Log[lvl]][nod];
for (int i=lvl;i>=0;i--)
if (PW[i])
return Solve(lvl-i, D[Log[i]][nod]);
}
int main ()
{
n=GetInt();m=GetInt();
PW[0]=PW[1]=1;
for (i=2;i<=n;i++)
{
Log[i]=Log[i/2]+1;
if (i%2==0)
PW[i]=PW[i/2];
}
for (i=1;i<=n;i++)
D[0][i]=GetInt();
for (j=1;j<L;j++)
for (i=1;i<=n;i++)
D[j][i]=D[j-1][D[j-1][i]];
for (i=1;i<=m;i++)
{
q=GetInt();p=GetInt();
fprintf(fout,"%d\n",Solve(p,q));
}
fclose(fin);fclose(fout);
return 0;
}