Pagini recente » Cod sursa (job #2951988) | Cod sursa (job #815557) | Cod sursa (job #142075) | Cod sursa (job #2459081) | Cod sursa (job #3158243)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int NMAX = 250003;
vector<int> g[NMAX];
int stramos[NMAX][20];
bool vis[NMAX];
void dfs(int nod) {
vis[nod] = true;
for (int p = 1; p <= 18; p++) {
stramos[nod][p] = stramos[stramos[nod][p - 1]][p - 1];
}
for (auto fiu : g[nod]) {
if (!vis[fiu]) {
dfs(fiu);
}
}
}
int get_stramos(int nod, int u) {
for (int p = 18; p >= 0; p--) {
if ((1 << p) <= u) {
u -= (1 << p);
nod = stramos[nod][p];
}
}
return nod;
}
int main() {
int n, q;
fin >> n >> q;
for (int i = 1; i <= n; i++) {
fin >> stramos[i][0];
if (stramos[i][0] != 0) {
g[stramos[i][0]].push_back(i);
}
}
for (int i = 1; i <= n; i++) {
if (!vis[i])
dfs(i);
}
while (q--) {
int u, v; // al u-lea stramos a lui v
fin >> v >> u;
fout << get_stramos(v, u) << '\n';
}
return 0;
}