Cod sursa(job #2566389)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 2 martie 2020 20:59:42
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
#define DIM 200010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,i,j,x,y,p,l[25],d[25][DIM],e[DIM],niv[DIM],k,f[DIM];
vector<int> L[DIM/2];
void euler(int nod,int nivel) {
    e[++k]=nod, niv[k]=nivel, f[nod]=k;
    for (int i=0;i<L[nod].size();i++) {
        int vecin=L[nod][i];
        euler(vecin,nivel+1);
        e[++k]=nod, niv[k]=nivel;
    }
}
int main() {
    fin>>n>>m;
    for (i=2;i<=n;i++) {
        fin>>x;
        L[x].push_back(i);
    }
    euler(1,1);
    for (i=1;i<=k;i++)
        d[0][i]=i;
    for (i=2;i<=k;i++)
        l[i]=1+l[i/2];
    for (i=1;i<=l[k];i++) {
        for (j=1;j<=k;j++) {
            d[i][j]=d[i-1][j];
            if (j+(1<<(i-1))<=k)
                if (niv[d[i][j]]>niv[d[i-1][j+(1<<(i-1))]])
                    d[i][j]=d[i-1][j+(1<<(i-1))];
        }
    }
    for (i=1;i<=m;i++) {
        fin>>x>>y;
        x=f[x], y=f[y];
        if (x>y)
            swap(x,y);
        p=l[y-x+1];
        if (niv[d[p][x]]<niv[d[p][y-(1<<p)+1]])
            fout<<e[d[p][x]]<<"\n";
        else
            fout<<e[d[p][y-(1<<p)+1]]<<"\n";
    }
    return 0;
}