Pagini recente » Cod sursa (job #2074906) | Cod sursa (job #1330900) | Cod sursa (job #3041649) | Cod sursa (job #3150332) | Cod sursa (job #2973721)
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
int Stra_Log(int Q, int P, vector<int> &V, vector< vector<int> > &M)
{
int l = 0;
while ( (1 << l) <= P )
l++;
l--;
Q = M[l][Q];
P -= (1 << l);
if (P == 0)
return Q;
if (Q == -1)
return -1;
return Stra_Log(Q, P, V, M);
}
int main()
{
int n, m;
in>> n >> m;
vector<int> V(n);
for (int i = 0; i < n; i++)
{
in>> V[i];
V[i]--;
}
int p = 0;
while ( (1 << p) < n)
p++;
p--;
vector< vector<int> > M(p + 1, vector<int> (n, 0));
for (int i = 0; i < n; i++)
M[0][i] = V[i];
for (int i = 1; i <= p; i++)
for (int j = 0; j < n; j++)
if (M[i - 1][j] == -1)
M[i][j] = -1;
else
M[i][j] = M[i - 1][M[i - 1][j]];
for (int t = 0; t < m; t++)
{
int Q, P;
in>> Q >> P; Q--;
out<< Stra_Log(Q, P, V, M) + 1 << "\n";
}
return 0;
}