Cod sursa(job #2054567)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 2 noiembrie 2017 09:34:18
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
# include <fstream>
# include <vector>
# define DIM 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> Lista[DIM];
int v[20][DIM],niv[DIM],n,q,i,j,step,x,y;
void dfs(int nc,int pas){
    niv[nc]=pas;
    for(int i=0;i<Lista[nc].size();i++){
        int nv=Lista[nc][i];
        if(!niv[nv])
            dfs(nv,pas+1);
    }
}
int main () {
    fin>>n>>q;
    for(i=2;i<=n;i++){
        fin>>v[0][i];
        Lista[v[0][i]].push_back(i);
    }
    for(step=2,j=1;step<=n;step*=2,j++)
        for(i=1;i<=n;i++)
            v[j][i]=v[j-1][v[j-1][i]];
    dfs(1,1);
    for(i=1;i<=q;i++){
        fin>>x>>y;
        if(niv[y]<niv[x])
            swap(x,y);
        for(step=1,j=0;step<=n;step*=2,j++);
        for(;step;step/=2,j--)
            if(niv[y]-step>=niv[x])
                y=v[j][y];
        if(x==y){
            fout<<x<<"\n";
            continue;
        }
        for(step=1,j=0;step<=n;step*=2,j++);
        for(;step;step/=2,j--)
            if(v[j][x]!=v[j][y]){
                x=v[j][x];
                y=v[j][y];
            }
        fout<<v[0][x]<<"\n";
    }
    return 0;
}