Cod sursa(job #3341532)

Utilizator BidonTurtitBezdedan Eric BidonTurtit Data 19 februarie 2026 20:45:28
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#define NMax 100005
#define LMax 18
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

vector<int> vecini[NMax];
bitset <NMax> v;
int n,m,e[NMax*2],rmq[2*NMax][LMax+1],first[NMax],lg[NMax*2],level[NMax*2],cnt;
void dfs(int start, int &cnt,int l)
{
    e[++cnt]=start;
    level[cnt]=l;
    if(v[start]==0)
    {
        v[start]=1;
        first[start]=cnt;
    }
    for(auto node:vecini[start])
    {
        dfs(node,cnt,l+1);
        e[++cnt]=start;
        level[cnt]=l;
    }
}
int main()
{
   fin>>n>>m;
   lg[1]=0;
   for(int i=2;i<=2*n;i++)
    lg[i]=lg[i/2]+1;
   for(int i=2;i<=n;i++)
   {
       int x;
       fin>>x;
       vecini[x].push_back(i);
   }
   cnt=0;
   dfs(1,cnt,0);
   for(int i=1;i<=2*n-1;i++)
    rmq[i][0]=i;
   for(int j=1;1<<j<=2*n-1;j++)
   {
       for(int i=1;i+(1<<j)-1<=2*n-1;i++)
       {
           if(level[rmq[i][j-1]]<=level[rmq[i+(1<<(j-1))][j-1]])
            rmq[i][j]=rmq[i][j-1];
            else
            rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
       }

   }
   for(int i=1;i<=m;i++)
   {
       int x,y;
       fin>>x>>y;
       x=first[x];
       y=first[y];
       if(x>y)
        swap(x,y);
       int len=y-x+1;
       int ind;
       if(level[rmq[x][lg[len]]]<=level[rmq[y-(1<<lg[len])+1][lg[len]]])
        ind=rmq[x][lg[len]];
       else
        ind=rmq[y-(1<<lg[len])+1][lg[len]];
       fout<<e[ind]<<"\n";

   }
}