Cod sursa(job #1416804)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 8 aprilie 2015 23:21:11
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#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_LOG][MAX_N];

inline int getAnc(int anc, int node) {
    int i, currAnc = node;
    for(i = 0; (1<<i) <= anc; i++) {
        if(anc & (1<<i)) {
            currAnc = ancestor[i][currAnc];
        }
    }
    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[0][i]);
        
    for(i = 1; i < MAX_LOG; i++) {
        for(j = 1; j <= N; j++) {
            ancestor[i][j] = ancestor[0][getAnc((1<<i)-1, j)];
        }
    }
    
    for(i = 1; i <= M; i++) {
        fscanf(in, "%d %d", &node, &anc);
        fprintf(out, "%d\n", getAnc(anc, node));
    }
    
    fclose(in);
    fclose(out);
    
    return 0;
}