Cod sursa(job #2841469)

Utilizator mihnea.cazan15mihnea cazan mihnea.cazan15 Data 29 ianuarie 2022 19:28:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

#define pb push_back

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

int n,m,t[100005],l[100005],P[100005][30],nr;
vector<int> v[100005];

int dfs(int nod)
{
   if(nod==1)
      return 0;
   if(!l[nod])
      l[nod]=dfs(P[nod][0])+1;
   return l[nod];
}
int log(int x){
  int log;

  log = 0;
  while(x > 1){
    log++;
    x>>=1;
  }

  return log;
}

int lca(int p,int q)
{
    if(l[q]<l[p])
       swap(p,q);
    int j=log(l[q]-l[p]);
    if(l[p]!=l[q])
    {while(j>=0 && l[q]>l[p])
    {
        if(l[q]-(1<<j)>=l[p])
           q=P[q][j];
        j--;
    }}
    if(p==q)
       return q;
    for(int i=log(l[p]);i>=0;i--)
    {
        if(P[q][i]!=P[p][i] && P[q][i]!=0 && P[p][i]!=0)
           p=P[p][i],q=P[q][i];
    }
    return P[p][0];
}

int main()
{
    int m;
    fin>>n>>m;
    for(int i=2;i<=n;i++)
    {
        int x;
        fin>>x;
        P[i][0]=x;
    }
    for(int i=2;i<=n;i++)
        l[i]=dfs(i);
    for(int j=1;(1<<j)<n;j++)
    {
        for(int i=1;i<=n;i++)
            P[i][j]=P[P[i][j-1]][j-1];
    }
    while(m--)
    {
        int p,q;
        fin>>p>>q;
        fout<<lca(p,q)<<"\n";
    }
    return 0;
}