Cod sursa(job #3273234)

Utilizator Bolfa_DBolfa Diana Bolfa_D Data 1 februarie 2025 11:57:10
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define NMAX 100500
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int f[NMAX], a[NMAX], b[NMAX], use[NMAX], d[NMAX];
vector<int>v[NMAX];

void dfs(int node)
{
    if(f[node]==0)
        f[node]=a[0]+1;
    a[++a[0]]=node;
    b[++b[0]]=d[node];
    use[node]=1;

    for(auto i:v[node])
        if(use[i]==0)
        {
            dfs(i);
            a[++a[0]]=node;
            b[++b[0]]=d[node];
        }
}
int comp(int x, int y)
{
    if(b[x]<b[y])
        return x;
    return y;
}
int n, m,x, y, z, lg, rmq[33][NMAX];
deque<int>q;
int main()
{
    fin>>n>>m;
    for(int i=2;i<=n;++i)
    {
        fin>>y;
        v[y].push_back(i);
    }

    q.push_back(1);
    d[1]=1;
    while(!q.empty())
    {
        x=q.front();
        q.pop_front();
        for(auto i:v[x])
        {
            d[i]=d[x]+1;
            q.push_back(i);
        }
    }

    dfs(1);
    for(int i=1;i<=n;++i)//rmq[lg][poz]=indice cu val min
        rmq[0][i]=i;

    for(int i=1;(1<<i)<=n;++i)
        for(int j=1;j+(1<<i)<=n;++j)
            rmq[i][j]=comp(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
//
//    for(int i=1;i<=a[0];++i)
//        cout<<a[i]<<" ";cout<<'\n';
    for(;m>0;--m)
    {
        fin>>x>>y;
        if(f[x]>f[y])
            swap(x, y);

        lg=log2(f[y]-f[x]+1);
        z=comp(rmq[lg][f[x]], rmq[lg][f[x]+(1<<lg)]);
        fout<<z<<'\n';
    }

    return 0;
}