Cod sursa(job #2712946)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 26 februarie 2021 21:10:44
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

#define nmax 100000

using namespace std;

vector<vector<int> > tree(nmax);

int n,m;
int h[nmax],first[nmax];
int rmq[nmax<<1][(int)log2(nmax<<1)+1],k=0;

void dfs(int nod,int nivel)
{
    h[nod]=nivel;
    rmq[k][0]=nod;
    first[nod]=k;
    k++;
    for(int i=0;i<tree[nod].size();i++)
    {
        dfs(tree[nod][i],nivel+1);
        rmq[k][0]=nod;
        k++;
    }
}

void doRmq()
{
    for(int i=1;i<=log2(k);i++)
    {
        for(int j=0;j<k-pow(2,i)+1;j++)
        {
            rmq[j][i]=h[rmq[j][i-1]]<h[rmq[j+(int)pow(2,i-1)][i-1]]?rmq[j][i-1]:rmq[j+(int)pow(2,i-1)][i-1];
        }
    }
}

int main()
{
    freopen("lca.in","r",stdin);
    freopen("lca.out","w",stdout);

    cin>>n>>m;
    for(int i=1;i<n;i++)
    {
        int a;
        cin>>a;
        tree[a-1].push_back(i);
    }
    dfs(0,0);
    doRmq();
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        if(b<a){int aux=a;a=b;b=a;}
        a=first[a-1],b=first[b-1];
        int rsz=log2(b-a+1),res;
        res=(rmq[a][rsz]>rmq[b-(int)pow(2,rsz)+1][rsz])?(rmq[a][rsz]):(rmq[b-(int)pow(2,rsz)+1][rsz]);
        cout<<res+1<<'\n';
    }
    return 0;
}