Cod sursa(job #2450231)

Utilizator ejoi2019Ejoi 2019 ejoi2019 Data 22 august 2019 13:05:02
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

const int N=100000+7;
pair <int,int> rmq[18][2*N];
int n,q,top;
int lg[2*N];
int fs[N];
int ls[N];
vector <int> g[N];

void dfs(int jeg,int dep)
{
        rmq[0][++top]={dep,jeg};

        for(auto &gami : g[jeg])
        {
                dfs(gami,dep+1);
                rmq[0][++top]={dep,jeg};
        }
}

int lca(int a,int b)
{
        if(fs[a]>ls[b])
                swap(a,b);
        int l=fs[a],r=ls[b],k=lg[r-l+1];
        return min(rmq[k][l],rmq[k][r-(1<<k)+1]).second;
}

int main()
{
        freopen("lca.in","r",stdin);
        freopen("lca.out","w",stdout);
        for(int i=2;i<2*N;i++)
                lg[i]=1+lg[i/2];
        scanf("%d%d",&n,&q);
        for(int i=2;i<=n;i++)
        {
                int t;
                scanf("%d",&t);   g[t].push_back(i);
        }

        dfs(1,0);
        for(int k=1;(1<<k)<=top;k++)
                for(int i=1;i+(1<<k)-1<=top;i++)
                        rmq[k][i]=min(rmq[k-1][i],rmq[k-1][i+(1<<(k-1))]);

        for(int i=1;i<=top;i++) ls[rmq[0][i].second]=i;
        for(int i=top;i>=1;i--) fs[rmq[0][i].second]=i;

        while(q--)
        {
                int a,b;
                scanf("%d%d",&a,&b);
                printf("%d\n",lca(a,b));
        }

        return 0;
}