Pagini recente » Cod sursa (job #2165813) | Cod sursa (job #2653522) | Cod sursa (job #2726127) | Cod sursa (job #379111) | Cod sursa (job #3134063)
#include <stdio.h>
#include <fstream>
#include <vector>
#include <cmath>
#define fin "stramosi.in"
#define fout "stramosi.out"
const int Nmax = 250001;
const int logNmax = 20;
std::vector<std::vector<long>> a(logNmax, std::vector<long>(Nmax));
int N, M;
long ancestor(long x, long p) {
for (int i = logNmax - 1; i >= 0; --i) {
if (p >= (1 << i)) {
x = a[i][x];
p -= (1 << i);
}
}
return x;
}
void solve() {
std::ifstream fi(fin);
std::ofstream fo(fout);
fi >> N >> M;
for (int i = 1; i <= N; ++i) {
fi >> a[0][i];
}
int logN = std::ceil(std::log2(N));
for (int k = 1; k <= logN; ++k) {
for (int i = 1; i <= N; ++i) {
a[k][i] = a[k - 1][a[k - 1][i]];
}
}
for (int m = 0; m < M; ++m) {
int i, j;
fi >> i >> j;
long k = ancestor(i, j);
fo << k << "\n";
}
fi.close();
fo.close();
}
int main() {
solve();
return 0;
}