Cod sursa(job #2807355)

Utilizator alexdumitruAlexandru Dumitru alexdumitru Data 23 noiembrie 2021 18:15:42
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> g[100005];
int n,i,j,x,y,cnt,l2[200005],h[100005],eu[200005],q,lev[200005],rmq[200005][20];
bool vis[100005];
void euler(int nod, int l)
{
    eu[++cnt]=nod;
    lev[cnt]=l;
    if(!h[nod])h[nod]=cnt;
    for(auto x:g[nod])
    {
        euler(x,l+1);
        eu[++cnt]=nod;
    }
}
void build()
{
    for(i=1;i<n*2;i++)
        rmq[i][0]=eu[i];
    int p=1;
    for(j=1;(1<<j)<=2*n;j++)
    {
        p<<=1;
        for(i=1;i+p-1<=2*n;i++)
            rmq[i][j]=min(rmq[i][j-1],rmq[i+p/2][j-1]);
    }
}
int qr(int x, int y)
{
    int l=l2[y-x+1];
    return min(rmq[x][l],rmq[y-(1<<l)+1][l]);
}
int main()
{
    fin>>n>>q;
    for(i=2;i<=n;i++)
    {
        fin>>x;
        g[x].push_back(i);
    }
    for(i=2;i<=n*2;i++)
        l2[i]=l2[i>>1]+1;
    euler(1,1);
    build();
    while(q--)
    {
        fin>>x>>y;
        if(h[x]>h[y])swap(x,y);
        fout<<qr(h[x],h[y])<<'\n';
    }
    return 0;
}