Cod sursa(job #1402100)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 26 martie 2015 12:29:09
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <fstream>
#include <algorithm>

using namespace std;

#define inFile "stramosi.in"
#define outFile "stramosi.out"
#define MAX_N 250001
#define MAX_LOG 20

int anc[MAX_LOG][MAX_N];

int getAncestor(int k, int node);

int main() {
    ifstream in(inFile);
    ofstream out(outFile);
    
    int n, m, i, j, kAnc, node;
    
    in >> n >> m;
    for(i = 1; i <= n; i++)
        in >> anc[0][i];
    
    for(i = 1; (1<<i) <= n; i++) {
        for(j =  1; j <= n; j++) {
            anc[i][j] = anc[0][getAncestor(1<<(i-1), j)];
        }
    }
    
    for(i = 1; i <= m; i++) {
        in >> node >> kAnc;
        out << getAncestor(kAnc, node) << '\n';
    }
    
    return 0;
}

int getAncestor(int k, int node) {
    int i, currAnc = node;
    for(i = 0; (1<<i) <= k; i++)
        if((1<<i) & k) currAnc = anc[i][currAnc];
    return currAnc;
}