Pagini recente » Cod sursa (job #446256) | Cod sursa (job #2326205) | Cod sursa (job #763861) | Cod sursa (job #2551357) | Cod sursa (job #3038229)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
constexpr int LIM = 250005;
constexpr int LOG2_LIM = 20;
int N, M, father[LIM], dp[LIM][LOG2_LIM];
int node, P;
vector<int> G[LIM];
inline void dfs(int node, int level, int lg_level) {
if (level == (1 << (lg_level + 1))) ++lg_level;
dp[node][0] = father[node];
for (int i = 1; i <= lg_level; ++i)
dp[node][i] = dp[dp[node][i - 1]][i - 1];
for (const int adj : G[node])
if (adj != father[node]) dfs(adj, level + 1, lg_level);
}
int main() {
fin >> N >> M;
for (int i = 1; i <= N; ++i) {
fin >> father[i];
G[father[i]].push_back(i);
}
dfs(0, 0, -1);
for (int i = 1; i <= M; ++i) {
fin >> node >> P;
for (int j = 0; P; P >>= 1, ++j)
if (P & 1) node = dp[node][j];
fout << node << '\n';
}
fin.close();
fout.close();
return 0;
}