Cod sursa(job #2054597)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 2 noiembrie 2017 10:04:58
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 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],lg[DIM],p[20],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=0,step=1;i<20;step*=2,i++)
        p[i]=step;
    for(i=2;i<=DIM-5;i++)
        lg[i]=lg[i/2]+1;
    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);
        if(niv[x]!=niv[y])
            for(step=p[lg[niv[y]-niv[x]]],j=lg[niv[y]-niv[x]];step;step/=2,j--)
                if(niv[y]-step>=niv[x])
                    y=v[j][y];
        if(x==y){
            fout<<x<<"\n";
            continue;
        }
        for(step=p[lg[niv[x]]],j=lg[niv[x]];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;
}