Cod sursa(job #3124083)

Utilizator Raul_AArdelean Raul Raul_A Data 26 aprilie 2023 20:42:48
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
#define cin in 
#define cout out 
using namespace std;

const string file_name("lca");

ifstream in(file_name + ".in");
ofstream out(file_name + ".out");

int n,m,x,y;
vector<int> G[100005],v;
int st[100005],cnt,rmq[20][200005],Log[200005];

void dfs(int k)
{
    v.push_back(k);
    cnt++;
    st[k] = cnt;

    for (auto x : G[k])
        if(x!=k)
        {
            dfs(x);
            v.push_back(k);
            cnt++;
        }
}


void logaritm()
{
    Log[1] = 0;

    for (int i = 2; i <= cnt; i++)
        Log[i] = Log[i / 2] + 1;
}

void init()
{
    logaritm();

    for (int i = 1; i <= cnt; i++)
        rmq[0][i] = v[i];

    for (int i = 1; (1 << i) <= cnt; i++)
        for (int j = (1 << i); j <= cnt; j++)
        {
            int k = 1 << (i - 1);
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j - k]);
        }
}

int queryRMQ(int x, int y)
{
    int k = Log[y - x + 1];
    return min(rmq[k][x + (1 << k) - 1], rmq[k][y]);
}

int main()
{
    cin>>n>>m;
    for(int i=2;i<=n;i++)
        cin>>x,G[x].push_back(i);
     
    v.push_back(0);
    dfs(1);
    
    init();
    
    while(m--)
    {
        cin>>x>>y;
        x=st[x],y=st[y];
        if(x>y) swap(x,y);
        cout<<queryRMQ(x,y)<<'\n'; 
    }
    return 0;
}