Pagini recente » Cod sursa (job #261862) | Cod sursa (job #144308) | Cod sursa (job #2391162) | Istoria paginii runda/lista3/clasament | Cod sursa (job #1673143)
#include <iostream>
#include <fstream>
#define DIM 100000
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int NMAX = 250005;
int sp[NMAX][20];
int n,m;
int lg[NMAX];
char buff[DIM];
int poz = 0;
void Read(int &a)
{
while(!isdigit(buff[poz]))
if(++poz==DIM)
in.read(buff,DIM),poz = 0;
a = 0;
while(isdigit(buff[poz]))
{
a = a*10 + buff[poz] - '0';
if(++poz==DIM)
in.read(buff,DIM),poz = 0;
}
}
void citire()
{
Read(n);
Read(m);
for(int i=1;i<=n;i++)
Read(sp[i][0]);
}
void sparse_table()
{
for(int i=2;i<=n;i++)
lg[i] = lg[i/2] + 1;
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i<=n;i++)
sp[i][j] = sp[sp[i][j-1]][j-1];
}
int main()
{
citire();
sparse_table();
int x,y,k;
for(int i=1;i<=m;i++)
{
Read(x);
Read(y);
while(y)
{
k = lg[y];
x = sp[x][k];
y = y-(1<<k);
}
out<<x<<"\n";
}
in.close();
out.close();
return 0;
}