Cod sursa(job #2712951)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 26 februarie 2021 21:29:56
Problema Lowest Common Ancestor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 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);

    scanf("%i %i",&n,&m);
    for(int i=1;i<n;i++)
    {
        int a;
        scanf("%i",&a);
        tree[a-1].push_back(i);
    }
    dfs(0,0);
    doRmq();

    /*for(int i=0;i<=log2(k);i++)
    {
        for(int j=0;j<k-pow(2,i)+1;j++)
        {
            cout<<rmq[j][i]<<' ';
        }
        cout<<'\n';
    }*/

    for(int i=0;i<m;i++)
    {
        int a,b;
        scanf("%i %i",&a,&b);
        a=first[a-1],b=first[b-1];
        if(b<a){int aux=a;a=b;b=aux;}
        int rsz=log2(b-a+1),res;
        res=(h[rmq[a][rsz]]<h[rmq[b-(int)pow(2,rsz)+1][rsz]])?(rmq[a][rsz]):(rmq[b-(int)pow(2,rsz)+1][rsz]);
        printf("%i \n",res+1);
    }
    return 0;
}