Cod sursa(job #2151548)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 4 martie 2018 16:53:43
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#define MAX 100001

using namespace std;

int n,m,a,b,st,dr,mij;
int lv[MAX],s[MAX][17];
void parcurge(int nod){
  if(lv[nod])return;
  parcurge(s[nod][0]); lv[nod]=lv[s[nod][0]]+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];
    for(int i=1;i<=16;i++)for(int j=1;j<=n;j++)s[j][i]=s[s[j][i-1]][i-1];
    lv[1]=1; for(int i=1;i<=n;i++)parcurge(i);
    for(int i=1;i<=m;i++){
      f>>a>>b;
      if(lv[a]>lv[b])a=stramos(a,lv[a]-lv[b]);
      else b=stramos(b,lv[b]-lv[a]);
      st=0,dr=lv[a]-1;
      while(st<dr){
        mij=(st+dr)/2;
        if(stramos(a,mij)==stramos(b,mij))dr=mij;
        else st=mij+1;
      }
      g<<stramos(a,st)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}