Cod sursa(job #3280805)

Utilizator MilitaruMihaiMihaiMIlitaru MilitaruMihai Data 27 februarie 2025 15:59:06
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,k,t[100005],len,d[200005][25];
int ap[100005],viz[100005],niv[100005];
int e[200005];
vector <int> v[100005];
void dfs(int nod)
{
    k++;
    e[++len]=nod;
    if (!ap[nod])
    {
        ap[nod]=len;
        niv[nod]=k;
    }
    viz[nod]=1;
    for (int i : v[nod])
    {
        if (!viz[i]) dfs(i);
    }
    e[++len]=t[nod];
    k--;
}
int main()
{
    fin>>n>>q;
    for (int i=2;i<=n;i++)
    {
        int nod;
        fin>>nod;
        t[i]=nod;
        v[nod].push_back(i);
    }
    k=-1;
    dfs(1);
    len--;
    /**for (int i=1;i<=len;i++)
        cout<<e[i]<<' ';
    cout<<'\n';
    for (int i=1;i<=n;i++)
        cout<<niv[i]<<' ';**/

    for (int i=1;i<=len;i++)
        d[i][0]=e[i];

    for (int j=1;(1<<j)<=len;j++)
        for (int i=1;i+(1<<j)-1<=len;i++)
            //d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
            {
                if (niv[d[i][j-1]]<niv[d[i+(1<<(j-1))][j-1]])
                    d[i][j]=d[i][j-1];
                    else d[i][j]=d[i+(1<<(j-1))][j-1];
            }

    for (int i=1;i<=q;i++)
    {
        int nod1,nod2;
        fin>>nod1>>nod2;
        int p1=ap[nod1],p2=ap[nod2];
        if (p1>p2) swap(p1,p2);
        int p=log2(p2-p1+1);
        //int mn=min(d[p1][p],d[p2-(1<<p)+1][p]);
        if (niv[d[p1][p]]<niv[d[p2-(1<<p)+1][p]]) fout<<d[p1][p]<<'\n';
            else fout<<d[p2-(1<<p)+1][p]<<'\n';
    }
    return 0;
}