Cod sursa(job #2153511)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 6 martie 2018 11:45:34
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100001

using namespace std;

int n,m,p,a,b,st,dr,mij,nvmax;
int lv[MAX],s[MAX][17];
vector<int> nd[MAX];
void parcurge(int nod,int niv){
  lv[nod]=niv;nvmax=max(nvmax,niv);
  for(auto i:nd[nod])parcurge(i,niv+1);
}
int stramos(int nod,int gr){
  for(int sp=0;gr;sp++,gr/=2)if(gr%2)nod=s[nod][sp];
  return nod;
}

int main()
{
    ifstream f ("lca.in");
    ofstream g ("lca.out");
    f>>n>>m;
    for(int i=2;i<=n;i++)f>>s[i][0],nd[s[i][0]].push_back(i);
    parcurge(1,1);
    for(int i=1;(1<<i)<=nvmax;i++)for(int j=1;j<=n;j++)s[j][i]=s[s[j][i-1]][i-1];
    for(int i=1;i<=m;i++){
      f>>a>>b;
      st=0,dr=lv[a]-1;
      while(st<dr){
        mij=(st+dr)/2;
        if(stramos(a,mij)==stramos(b,mij+lv[b]-lv[a]))dr=mij;
        else st=mij+1;
      }
      g<<stramos(a,st)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}