Cod sursa(job #2565443)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 2 martie 2020 14:14:41
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<vector>
#define DIM 200005
using namespace std;
int n, q, nr, i, ii, x, y;
int a[19][DIM], pt[DIM], niv[DIM], frst[DIM];
vector<int> v[DIM];
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int nod){
    a[0][++nr] = nod;
    frst[nod] = nr;
    for(int i = 0; i < v[nod].size(); i++){
        int vecin = v[nod][i];
        niv[vecin] = niv[nod] + 1;
        dfs(vecin);
        a[0][++nr] = nod;
    }
}
int main(){
    fin>> n >> q;
    for(i = 2; i <= n; i++){
        fin>> x;
        v[x].push_back(i);
    }
    dfs(1);
    for(ii = 1; (1 << ii) <= nr; ii++){
        for(i = 1; i <= nr - (1 << ii) + 1; i++){
            a[ii][i] = a[ii - 1][i];
            if(niv[ a[ii][i] ] > niv[ a[ii - 1][i + (1 << (ii - 1) )] ]){
                a[ii][i] = a[ii - 1][ i + (1 << (ii - 1) ) ];
            }
        }
    }
    for(i = 2; i <= nr; i++){
        pt[i] = 1 + pt[i / 2];
    }
    for(; q; q--){
        fin>> x >> y;
        x = frst[x];
        y = frst[y];
        if(x > y){
            swap(x, y);
        }
        ii = pt[y - x + 1];
        if(niv[ a[ii][x] ] < niv[ a[ii][y - (1 << ii) + 1] ]){
            fout<< a[ii][x] <<"\n";
        }
        else{
            fout<< a[ii][y - (1 << ii) + 1] <<"\n";
        }
    }
    return 0;
}