Pagini recente » Cod sursa (job #2343331) | Cod sursa (job #2377102) | Cod sursa (job #835361) | Cod sursa (job #1201310) | Cod sursa (job #3301721)
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("stramosi.in");
ofstream fo("stramosi.out");
const int logmax = 17;
int P[250001];
int Dp[18][250001];
vector<int> relevant[2];
int main() {
int N, M;
fi >> N >> M;
for (int i = 1; i <= N; i++) {
fi >> P[i];
Dp[0][i] = P[i];
if (P[i] != 0) {
relevant[1].push_back(i);
}
}
int cr = 1;
for (int l = 1; l <= logmax; l++) {
relevant[1 - cr].clear();
for (auto node: relevant[cr]) {
Dp[l][node] = Dp[l - 1][Dp[l - 1][node]];
if (Dp[l][node] != 0) {
relevant[1 - cr].push_back(node);
}
}
cr = 1 - cr;
}
for (int i = 1; i <= M; i++) {
int q, p;
fi >> q >> p;
int cr = q;
for (int p2 = logmax; p2 >= 0; p2--) {
if ((1 << p2) <= p) {
p -= (1 << p2);
cr = Dp[p2][cr];
}
}
fo << cr << "\n";
}
}