Cod sursa(job #2500955)

Utilizator Raresr14Rosca Rares Raresr14 Data 28 noiembrie 2019 21:29:36
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int E[200010],N[200010],first[100010],x,y,a,b,n,m,i,k,D[17][200010],L1[200010];
vector<int> L[100010];
void dfs(int nod, int niv){
    E[++k]=nod;
    first[nod]=k;
    N[k]=niv;
    for(int i=0;i<L[nod].size();i++){
        int vec=L[nod][i];
        dfs(vec,niv+1);
        E[++k]=nod;
        N[k]=niv;
    }
}
int main(){
    fin>>n>>m;
    for(i=1;i<n;i++){
        fin>>x;
        L[x].push_back(i+1);
    }
    dfs(1,1);
    for(i=1;i<=k;i++)
        D[0][i]=i;
    for(i=1;(1<<i)<=k;i++)
        for(int j=1;j<=k;j++){
            D[i][j]=D[i-1][j];
            if(j+(1<<(i-1))<=k&&N[D[i-1][j+(1<<(i-1))]]<N[D[i-1][j]])
                D[i][j]=D[i-1][j+(1<<(i-1))];
        }
    for(i=2;i<=k;i++)
        L1[i]=1+L1[i/2];
    for(;m--;){
        fin>>x>>y;
        x=first[x];
        y=first[y];
        a=min(x,y);
        b=max(x,y);
        int l=L1[b-a+1];
        if(D[l][a]<D[l][b-(1<<l)+1])
            fout<<E[D[l][a]]<<"\n";
        else
            fout<<E[D[l][b-(1<<l)+1]]<<"\n";
    }
    return 0;
}