Link to this code:
https://cses.fi/paste/65ef3a810b1af4482a419a/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<string, string> pss;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef vector<vi> vvi;
typedef vector<pii> vpi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef queue<int> qi;
typedef queue<pii> qpi;
typedef vector<char> vc;
typedef tuple<int, int, int> tiii;
typedef vector<tiii> vtiii;
#define pb push_back
#define ppb pop_back
#define pf push_front
#define ppf pop_front
#define all(x) (x).begin(), (x).end()
#define allArr(arr, sz) arr, arr + sz
#define fr first
#define sc second
#define mp make_pair
#define resetINT(row, col, constant) resize (row, vi (col, constant))
#define resetLL(row, col, constant) resize (row, vl (col, constant))
#define resetBOOL(row, col, constant) resize (row, vb (col, constant))
#define resetSTR(row, col, constant) resize (row, vs (col, constant))
#define FOR(a, b, c) for (int(a) = (b); (a) < (c); ++(a))
#define FORN(a, b, c) for (int(a) = (b); (a) <= (c); ++(a))
#define FORD(a, b, c) for (int(a) = (b); (a) >= (c); --(a))
#define FORSQ(a, b, c) for (int(a) = (b); (a) * (a) <= (c); ++(a))
#define FORC(a, b, c) for (char(a) = (b); (a) <= (c); ++(a))
#define FOREACH(a, b) for (auto&(a) : (b))
#define REP0(i, n) FOR(i, 0, n)
#define REP1(i, n) FOR(i, 1, n)
#define REP0N(i, n) FORN(i, 0, n)
#define REP1N(i, n) FORN(i, 1, n)
#define MAX(a, b) a = max(a, b)
#define MIN(a, b) a = min(a, b)
#define sortVec(v) sort(all(v))
#define reverse(v) reverse(all(v))
#define sortArr(arr) sort(allArr(arr, sz))
#define sz(x) (int)((x).size())
#define tc(t) while(t--)
#define perm next_permutation
#define ppc __builtin_popcount
#define ppcll __builtin__popcountll
// const int MOD1 = (int) 1e9 + 7;
// const int MOD2 = 998244353;
// const ll LINF = (ll) 2e18;
// const int IINF = (int) 2e9;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int t{1};
//cin >> t;
tc (t) {
int n, q;
cin >> n >> q;
vvi dp(n + 1, vi (31));
vb loop(n + 1, false);
REP1N (i, n) {
cin >> dp[i][0];
loop[i] = i == dp[i][0];
}
REP1N (k, 30) {
REP1N (x, n) {
dp[x][k] = dp[dp[x][k - 1]][k - 1];
}
}
int x, k;
REP0 (i, q) {
cin >> x >> k;
int go = 0;
while (k && !loop[x]) {
if (k & 1){
x = dp[x][go];
}
go++;
k >>= 1;
}
cout << x << "\n";
}
}
return 0;
}