Pagini recente » Cod sursa (job #1283939) | Cod sursa (job #2572439) | Cod sursa (job #547528) | Cod sursa (job #130101) | Cod sursa (job #1385282)
/*
Keep It Simple!
*/
#include <fstream>
#include <vector>
#include <list>
#include <stack>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
#define ll long long
#define mp make_pair
#define fi first
#define se second
#define pb push_back
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int kMaxN = 250005;
int lb[kMaxN],t[kMaxN];
int dp[20][kMaxN];
int n,m;
void ComputeLb()
{
for(int i=2; i<=250000; ++i)
lb[i] = lb[i/2] + 1;
}
void ReadInput()
{
fin >> n >> m;
for(int i=1; i<=n; ++i)
fin >> t[i];
}
void ComputeDp()
{
for(int j=1; j<=n; ++j)
for(int i=0; 1<<i <= n; ++i)
dp[i][j] = -1;
for(int i=1; i<=n; ++i)
dp[0][i] = t[i];
for(int i=1; 1<<i <= n; ++i)
for(int j=1; j<=n; ++j)
if(dp[i-1][j] != -1)
dp[i][j] = dp[i-1][dp[i-1][j]];
}
int Query(int P,int Q)
{
int location;
while(P)
{
if(Q == -1 || !Q ) return 0;
location = lb[P-1];
Q = dp[location][Q];
P -= 1<<location;
}
return Q;
}
void SolveQueries()
{
int x,y;
for(int i=1; i<=m; ++i)
{
fin >> x >> y;
fout << Query(y,x) << '\n';
}
}
void Solve()
{
ComputeLb();
ReadInput();
ComputeDp();
SolveQueries();
}
int main()
{
Solve();
return 0;
}