Pagini recente » Cod sursa (job #1828406) | Cod sursa (job #1630865) | Cod sursa (job #1188228) | Cod sursa (job #1440036) | Cod sursa (job #977384)
Cod sursa(job #977384)
#include <fstream>
#include <vector>
using namespace std;
const int MAX_N = 250002;
int N, M;
int dp[MAX_N][20], F[MAX_N], log2[MAX_N];
vector < int > v[MAX_N], Lv[MAX_N];
inline void DFS(int x, int lv) {
Lv[lv].push_back(x);
for(size_t i = 0; i < v[x].size(); ++i)
DFS(v[x][i], lv+1);
}
inline int Query(int x, int k) {
while(k) {
int t = log2[k];
x = dp[x][t];
k -= (1 << t);
}
return x;
}
int main() {
ifstream f("stramosi.in");
ofstream g("stramosi.out");
f >> N >> M;
for(int i = 1; i <= N; ++i) {
f >> F[i];
v[F[i]].push_back(i);
}
for(int i = 2; i < MAX_N; ++i)
log2[i] = log2[i/2] + 1;
for(int i = 1; i <= N; ++i)
if(!F[i])
DFS(i, 0);
for(int i = 1; i < N; ++i) {
for(size_t j = 0; j < Lv[i].size(); ++j) {
int x = Lv[i][j];
dp[x][0] = F[x];
for(int k = 1; (1 << k) <= i; ++k)
dp[x][k] = dp[dp[x][k-1]][k-1];
}
}
for(int i = 1, x, k; i <= M; ++i) {
f >> x >> k;
g << Query(x, k) << '\n';
}
f.close();
g.close();
return 0;
}