Cod sursa(job #2175352)

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