Cod sursa(job #2712953)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 26 februarie 2021 21:45:10
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 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;
int lg[nmax<<1];

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()
{
    lg[0]=0,lg[1]=0;
    for(int i=2;i<=k;i++)
        lg[i]=lg[i>>1]+1;
    //for(int i=0;i<=k;i++) cout<<lg[i]<<' ';
    //cout<<'\n';
    for(int i=1;i<=lg[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=lg[b-a+1],res;
        int pwr=1<<rsz;
        res=(h[rmq[a][rsz]]<h[rmq[b-pwr+1][rsz]])?(rmq[a][rsz]):(rmq[b-pwr+1][rsz]);
        printf("%i \n",res+1);
    }
    return 0;
}