Pagini recente » Cod sursa (job #59771) | Cod sursa (job #2156613) | Cod sursa (job #2421877) | Cod sursa (job #2828023) | Cod sursa (job #1416796)
#include <cstdio>
using namespace std;
#define inFile "stramosi.in"
#define outFile "stramosi.out"
#define MAX_N 250001
#define MAX_LOG 19
FILE *in = fopen(inFile, "r");
FILE *out = fopen(outFile, "w");
int ancestor[MAX_N][MAX_LOG];
inline int getAnc(int anc, int node) {
int i, currAnc = node;
for(i = 0; (1<<i) <= anc; i++) {
if(anc & (1<<i)) {
currAnc = ancestor[currAnc][i];
}
}
return currAnc;
}
int main() {
int N, M, anc, node;
register int i, j;
fscanf(in, "%d %d", &N, &M);
for(i = 1; i <= N; i++)
fscanf(in, "%d", &ancestor[i][0]);
for(i = 1; i <= N; i++) {
for(j = 1; j < MAX_LOG; j++) {
ancestor[i][j] = ancestor[getAnc((1<<j)-1, i)][0];
}
}
for(i = 1; i <= M; i++) {
fscanf(in, "%d %d", &node, &anc);
fprintf(out, "%d\n", getAnc(anc, node));
}
return 0;
}