Cod sursa(job #3280813)

Utilizator Silviu643Dumitrescu Silviu Florian Silviu643 Data 27 februarie 2025 16:24:37
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m;
vector <int> v[100005];
int d[200005][25],eulr[200005],nivl[200005],cnt,t[100005],nr1,nr2,apr[100005];
bool f[100005];
void dfs(int s)
{
    f[s]=1;
    //eulr[++cnt]=s;
    for(auto it : v[s])
    {

        if(!f[it])
        {
            eulr[++cnt]=s;
            if(!apr[s]) apr[s]=cnt;
            f[it]=1;
            dfs(it);
        }
        //eulr[++cnt]=s;
    }
    //if(ok)
    eulr[++cnt]=s;
    if(!apr[s]) apr[s]=cnt;
}
int main()
{
    in>>n>>m;
    for(int i=2;i<=n;i++)
        {   int x;
            in>>x;
        nivl[i]=nivl[x]+1;
        v[i].push_back(x);
        v[x].push_back(i);
        }
    for(int i=1;i<=n;i++)
        sort(v[i].begin(),v[i].end());
    dfs(1);
    /*for(int i=1;i<=cnt;i++)
        cout<<eulr[i]<<' ';
    cout<<'\n';
    for(int i=1;i<=cnt;i++)
        cout<<nivl[eulr[i]]<<' ';
        */
    for(int i=1;i<=cnt;i++)
        d[i][0]=eulr[i];

    for(int j=1;(1<<j)<=cnt;j++)
        for(int i=1;(i+(1<<(j))-1)<=cnt;i++)
    //d[i][j]=min(nivl[d[i][j-1]],nivl[d[i+(1<<(j-1))][j-1]]);
        if(nivl[d[i][j-1]]>nivl[d[i+(1<<(j-1))][j-1]])
            d[i][j]=d[i+(1<<(j-1))][j-1];
        else d[i][j]=d[i][j-1];
    for(int i=1;i<=m;i++)
    {
        in>>nr1>>nr2;
        int ok1=0,ok2=0;
        int x,y;
        x=apr[nr1];
        y=apr[nr2];
        if(x>y) swap(x,y);
        int p=log2(y-x+1);
        //out<<min(d[x][p],d[y-(1<<p)+1][p])<<'\n';
        if(nivl[d[x][p]]>nivl[d[y-(1<<p)+1][p]])
            out<<d[y-(1<<p)+1][p]<<'\n';
        else out<<d[x][p]<<'\n';
    }
    return 0;
}