Cod sursa(job #3276482)

Utilizator Dia3141Costea Diana Stefania Dia3141 Data 13 februarie 2025 19:12:53
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <vector>
#define nmax (int)(1e5+1)
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,m,k,x,y,rmq[20][nmax*3],e[20][nmax*3],p[nmax*3],poz[nmax*3];
vector<int>v[nmax];
void dfs(int nod,int lv){
    rmq[0][++k]=lv;
    e[0][k]=nod;
    poz[nod]=k;
    for(auto i:v[nod]){
        dfs(i,lv+1);
        rmq[0][++k]=lv;
        e[0][k]=nod;
    }
}
void Lca(){
    for(int i=2;i<=k;i++)
        p[i]=p[i/2]+1;
    for(int i=1;(1<<i)<=k;i++)
        for(int j=1;j<=k;j++){
            rmq[i][j]=rmq[i-1][j];
            e[i][j]=e[i-1][j];
            if(j+(1<<(i-1))<=k&&rmq[i][j]>rmq[i-1][j+(1<<(i-1))]){
                rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
                e[i][j]=e[i-1][j+(1<<(i-1))];
            }
        }
}
signed main()
{
    cin>>n>>m;
    for(int i=2;i<=n;i++){
        cin>>x;
        v[x].push_back(i);
    }
    dfs(1,1);
    Lca();
    while(m--){
        cin>>x>>y;
        int st=min(poz[x],poz[y]),dr=max(poz[x],poz[y]),l=p[dr-st+1];
        if(rmq[l][st]<rmq[l][dr-(1<<l)+1])
            cout<<e[l][st]<<'\n';
        else
            cout<<e[l][dr-(1<<l)+1]<<'\n';
    }
    return 0;
}