Pagini recente » Cod sursa (job #3004270) | Cod sursa (job #301045) | Cod sursa (job #2204674)
#include <bits/stdc++.h>
#define dbg(x) cerr<<#x": "<<x<<"\n"
#define dbg_p(x) cerr<<#x": "<<x.first<<","<<x.second<<"\n"
#define dbg_v(x, n) do{cerr<<#x"[]: ";for(int _=0;_<n;++_)cerr<<x[_]<<" ";cerr<<'\n';}while(0)
#define dbg_ok cerr<<"OK!\n"
#define st first
#define nd second
#define DMAX
#define NMAX
#define MMAX
using namespace std;
int n, m, x,q,p;
template<class T>
ostream& operator<<(ostream& out, vector<T> v) {
out << v.size() << '\n';
for(auto e : v) out << e << ' ';
return out;
}
// ifstream fin("stramosi.in");
// ofstream fout("stramosi.out");
vector<int> v[250005];
int lift[32][250005], par[250005], hist[250005];
void dfs(int nod, int nivel)
{
hist[nivel]=nod;
for (int i=0;(1 << i) < nivel;i++)
lift[i][nod]=hist[nivel-(1<<i)];
for (auto vec:v[nod])
dfs(vec,nivel+1);
}
int main() {
freopen("stramosi.in", "r", stdin);
freopen("stramosi.out", "w", stdout);
ios_base::sync_with_stdio(false);
// fin>>n>>m;
scanf("%d %d", &n, &m);
for (int i=1;i<=n;i++)
{
// fin>>x;
scanf("%d", &x);
par[i]=x;
if (x)
v[x].push_back(i);
}
for (int i=1;i<=n;i++)
if (!par[i])
dfs(i, 1);
for (int i=1;i<=m;i++)
{
// fin>>q>>p;
scanf("%d %d", &q, &p);
for (int j=17;j>=0;j--)
{
if ((1<<j)&p)
q=lift[j][q];
}
// fout<<q<<'\n';
printf("%d\n", q);
}
}