Cod sursa(job #2031249)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 2 octombrie 2017 21:34:33
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,q,level[100005],d[26][100005],p[26];
int lca( int x, int y ){
    if( level[x] > level[y] ){
        swap( x,y );
    }
    for (int i = 25; i >= 0; i --){
        if( level[y] - p[i] >= level[x] ){
            y = d[i][y];
        }
    }
    if( x == y ){
        return x;
    }
    for (int i = 25; i >= 0; i --){
        if( d[i][x] != d[i][y] ){
            x = d[i][x];
            y = d[i][y];
        }
    }
    return d[0][x];
}
int main(){
    in >> n >> q;
    for (int i = 2; i <= n; i ++){
        in >> d[0][i];
    }
    level[1] = 1;
    for (int i = 2; i <= n; i ++){
        level[i] = level[ d[0][i] ] + 1;
    }
    p[0] = 1;
    for (int i = 1; i <= 25; i ++){
        p[i] = p[i-1]*2;
    }
    for (int j = 1; j <= 25; j ++){
        for(int i = 1; i <= n; i ++){
            d[j][i] = d[j-1][ d[j-1][i] ];
        }
    }
    int a,b;
    for (int i = 1; i <= q; i ++){
        in >> a >> b;
        out<<lca( a,b )<<"\n";
    }
    return 0;
}