Cod sursa(job #3277607)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 16 februarie 2025 21:14:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream cin("lca.in");
ofstream cout("lca.out");

vector<int> v[100001],e;
int st[100001],cnt;
int max_put[200001];
int dr[100001];
int adan[100001];
int rmq[200001][21];
int ind[1000001][31];

void dfs(int tata,int nod){
    st[nod]=cnt;e.push_back(nod);cnt++;
    for(auto it:v[nod]){
        adan[it]=adan[nod]+1;
        dfs(nod,it);
        dr[nod]=cnt;e.push_back(nod);cnt++;
    }
}
void const_sp(){
    int aux1,put,i,j;
    for(i=2;i<=200000;i++){
        max_put[i]=max_put[i/2]+1;
    }
    aux1=max_put[e.size()];
    put=1;
    for(i=1;i<=aux1;i++){
        for(j=0;j+put*2-1<e.size();j++){
            if(rmq[j][i-1]<rmq[j+put][i-1]){
                rmq[j][i]=rmq[j][i-1];
                ind[j][i]=ind[j][i-1];
            }else{
                rmq[j][i]=rmq[j+put][i-1];
                ind[j][i]=ind[j+put][i-1];
            }
        }
        put*=2;
    }
}

int main()
{
    int n,m,i,a,b,auxa,auxb;
    cin>>n>>m;
    for(i=2;i<=n;i++){
        cin>>a;
        v[a].push_back(i);
    }
    for(i=1;i<=n;i++) st[i]=dr[i]=-1;
    dfs(1,1);
    for(i=0;i<e.size();i++){
        ///printf("%d %d\n",e[i],adan[e[i]]);
        rmq[i][0]=adan[e[i]];
        ind[i][0]=e[i];
    }
    const_sp();
    for(i=1;i<=n;i++){
        if(dr[i]==-1) dr[i]=st[i];
    }
    for(i=1;i<=m;i++){
        cin>>auxa>>auxb;
        a=min(st[auxa],st[auxb]);
        b=max(dr[auxa],dr[auxb]);
       /// printf("%d %d|\n",a,b);
        int len=(b-a+1);
        if(rmq[a][max_put[len]]<rmq[b-(1<<max_put[len])+1][max_put[len]]){
            cout<<ind[a][max_put[len]]<<"\n";
        }else{
            cout<<ind[b-(1<<max_put[len])+1][max_put[len]]<<"\n";
        }
    }
    return 0;
}