Pagini recente » Cod sursa (job #2077649) | Cod sursa (job #2044808) | Cod sursa (job #159729) | Cod sursa (job #118847) | Cod sursa (job #2792892)
#include <fstream>
#include <vector>
using namespace std;
const int N = 25e4 + 5;
const int LOG = 18;
vector<int> f[N], rad;
int up[N][LOG], nr[N];
void dfs(int nod) {
for (auto fiu : f[nod]) {
up[fiu][0] = nod;
nr[fiu] = nr[nod] + 1;
for (int i = 1; i < LOG; ++i)
up[fiu][i] = up[up[fiu][i - 1]][i - 1];
dfs(fiu);
}
}
int main() {
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; ++i) {
int j;
cin >> j;
if (j == 0)
rad.push_back(i);
else
f[j].push_back(i);
}
for (auto i : rad)
dfs(i);
while (q--) {
int nod, k;
cin >> nod >> k;
if (k > nr[nod]) {
cout << "0\n";
continue;
}
for (int i = LOG - 1; i >= 0; --i)
if (k & (1 << i))
nod = up[nod][i];
cout << nod << "\n";
}
cin.close();
cout.close();
return 0;
}