Cod sursa(job #3139193)

Utilizator petric_mariaPetric Maria petric_maria Data 26 iunie 2023 10:19:23
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,i,x,p,q,v[500001],h[100001],a[100001],ct,mat[21][500001],nvl[21][500001],ptr[21],k;
vector <int> vct[100001];
void dfs(int k,int hk){
    ++ct; v[ct]=k; h[k]=hk; a[k]=ct;
    int i;
    for(i=0;i<vct[k].size();++i){
        dfs(vct[k][i],hk+1);
        ++ct; v[ct]=k;
    }
}
int putere(int k){
    int p=0;
    while(k){
        ++p; k/=2;
    }
    return p-1;
}
int rmq(int x,int y){
    x=a[x]; y=a[y];
    if(x>y) swap(x,y);
    int p,mi;
    p=putere(y-x+1);
    if(nvl[p][x]<nvl[p][y-ptr[p]+1]) return mat[p][x];
    else return mat[p][y-ptr[p]+1];
}
int main()
{
    f>>n>>m;
    for(i=2;i<=n;++i){
        f>>x;
        vct[x].push_back(i);
    }
    ct=0;
    dfs(1,1);
    //for(i=1;i<=ct;++i) cout<<v[i]<<' ';
    for(i=1;i<=ct;++i) { mat[0][i]=v[i]; nvl[0][i]=h[v[i]]; }
    ptr[0]=1;
    for(i=1;i<=20;++i) ptr[i]=ptr[i-1]*2;
    for(k=1;k<=20;++k)
        for(i=1;i<=ct;++i){
            if(nvl[k-1][i] < nvl[k-1][i+ptr[k-1]]){
                nvl[k][i]=nvl[k-1][i];
                mat[k][i]=mat[k-1][i];
            }
            else{
                nvl[k][i]=nvl[k-1][i+ptr[k-1]];
                mat[k][i]=mat[k-1][i+ptr[k-1]];
            }
        }
    for(i=1;i<=m;++i){
        f>>p>>q;
        g<<rmq(p,q)<<'\n';
    }
    return 0;
}