Cod sursa(job #2428948)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 6 iunie 2019 22:50:17
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <vector>
#define def1 rm[i][j-1]
#define def2 rm[i+pow][j-1]
std::ifstream fin("lca.in");
std::ofstream fout("lca.out");

int n,m;
int fath[100500];
int pos[100500];
int rm[400500][50];
int d[100500];
std::vector<int> son[100500];
std::vector<int> eul;
void euler(int r)
{
  eul.push_back(r);
  for(std::vector<int>::iterator it = son[r].begin();it!=son[r].end();++it)
  {
    pos[*it]=eul.size();
    d[*it]=d[r]+1;
    euler(*it);
    eul.push_back(r);
  }
}

int logg(int k)
{
  if(k!=0)
    return 1+logg(k/2);
  return -1;
}

int main()
{
  fin>>n>>m;
  for(int i=2;i<=n;i++)
  {
    int p;
    fin>>p;
    fath[i]=p;
    son[p].push_back(i);
  }
  euler(1);
  int r= eul.size();
  for(int i=0;i<r;i++)
    rm[i][0]=eul[i];
  int pow=1;
  for(int j=1;pow<=r;j++,pow=pow*2)
  {
    for(int i=0;i<r;i++)
    {
      if(i+pow>=r) rm[i][j]=def1;
      else if(d[def1]<d[def2])
        rm[i][j]=def1;
      else
        rm[i][j]=def2;
    }
  }//*/
  for(int i=0;i<m;i++)
  {
    int a,b;
    fin>>a>>b;
    a=pos[a];
    b=pos[b];
    if(b<a)std::swap(a,b);
    int kk= b-a+1;
    kk= logg(kk);
    int poww= 1<<kk;
    int first = rm[a][kk];
    int second = rm[b-poww+1][kk];
    if(d[first]>d[second]) fout<<second<<"\n";
    else fout<<first<<"\n";
  }
}