Cod sursa(job #2723203)

Utilizator NashikAndrei Feodorov Nashik Data 13 martie 2021 19:16:33
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
//#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int euclid[200005],fr[100005],niv[100005],rmq[22][200005],prod[22],logo[2000005],cnt,t[100005];
vector <int> v[100005];
ifstream cin("lca.in");
ofstream cout("lca.out");
void dfs(int nod){
    euclid[++cnt]=nod;
    fr[nod]=cnt;
    for(auto u:v[nod]){
        niv[u]=niv[nod]+1;
        dfs(u);
        euclid[++cnt]=nod;
    }
}
int query(int st,int dr){
    st=fr[st];
    dr=fr[dr];
    //cout<<st<<" "<<dr<<"\n";
    int lg=logo[dr-st+1];
    if(niv[euclid[rmq[lg][st]]]<niv[euclid[rmq[lg][dr-prod[lg]+1]]]){
        return euclid[rmq[lg][st]];
    }
    return euclid[rmq[lg][dr-prod[lg]+1]];
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=2;i<=n;i++){
        cin>>t[i];
        v[t[i]].push_back(i);
    }
    niv[1]=1;
    dfs(1);
    prod[0]=1;
    //return 0;
    for(int i=1;i<=20;i++){
        prod[i]=prod[i-1]*2;
        //cout<<i<<" "<<prod[i]<<"\n";
        logo[prod[i]]++;
    }
    //return 0;
    for(int i=1;i<=200000;i++){
        logo[i]+=logo[i-1];
    }
    for(int i=1;i<=cnt;i++){
        rmq[0][i]=i;
    }
    for(int i=1;i<=20;i++){
        for(int j=1;j+prod[i]-1<=cnt;j++){
            if(niv[euclid[rmq[i-1][j]]]<niv[euclid[rmq[i-1][j+prod[i-1]]]])
                rmq[i][j]=rmq[i-1][j];
            else
                rmq[i][j]=rmq[i-1][j+prod[i-1]];
        }
    }
    //for(int i=1;i<=cnt;i++){
        //cout<<rmq[1][i]<<" ";

    //}
    //cout<<"\n";
    int a,b;
    for(int i=1;i<=m;i++){
        cin>>a>>b;
        cout<<query(a,b)<<"\n";
    }
    return 0;
}