Pagini recente » Cod sursa (job #1354947) | Cod sursa (job #1778796) | Cod sursa (job #1577686) | Clasament teme_acmunibuc_2013 | Cod sursa (job #3132980)
// https://infoarena.ro/problema/stramosi
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int MAXN=250005;
vector<int> adj[MAXN];
bool vis[MAXN];
int anc[18][MAXN];
void dfs(int h, int v, int p) {
vis[v] = true;
if (h==0) anc[h][v] = p;
else anc[h][v] = anc[h-1][anc[h-1][v]];
for (int u:adj[v]) {
if (u != p) dfs(h, u, v);
}
}
int main() {
int n, m;
fin>>n>>m;
for (int i=1; i<=n; ++i) {
int x;
fin>>x;
if (x!=0) {
adj[x].push_back(i);
adj[i].push_back(x);
}
}
for (int h=0; h<18; ++h) {
for (int i=1; i<=n; ++i) vis[i] = false;
for (int i=1; i<=n; ++i) {
if (!vis[i]) dfs(h, i, 0);
}
}
while (m--) {
int q, p;
fin>>q>>p;
int curr=q, lg=log2(p);
for (int j=lg; p; --j) {
curr = anc[j][curr];
p -= (1<<j);
}
fout<<curr<<endl;
}
}