Pagini recente » Cod sursa (job #2226300) | Cod sursa (job #2629689) | Cod sursa (job #3175126) | Cod sursa (job #2561051) | Cod sursa (job #2986365)
#include <bits/stdc++.h>
// #define in cin
// #define out cout
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int nmax = 2e5 + 5e4 + 5e0;
int dp[nmax][20]; // dp[nod][i] = stramosul al i^2 lea al lui nod
int n, m;
vector<int> adj[nmax];
void dfs(int nod)
{
for (int i = 1; i < 20; i++)
{
dp[nod][i] = dp[dp[nod][i - 1]][i - 1];
}
for (auto i : adj[nod])
{
dfs(i);
}
}
void readInput()
{
in >> n >> m;
for (int i = 1; i <= n; i++)
{
int t;
in >> t;
adj[t].push_back(i);
dp[i][0] = t;
}
}
int lastInd(int nr)
{
int bit = 1;
for (int i = 0; i < 32; i++)
{
if (bit & nr)
return i;
bit <<= 1;
}
return 0;
}
int query(int nod, int p)
{
if(p==0)return nod;
int bit = lastInd(p);
return query(dp[nod][bit], p - (1 << bit));
}
void solution()
{
for (int i = 0; i < m; i++)
{
int a, b;
in >> a >> b;
out << query(a, b) << '\n';
}
}
int main()
{
readInput();
dfs(0);
solution();
}