Cod sursa(job #1416796)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 8 aprilie 2015 23:12:22
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 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_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;
}