Cod sursa(job #2151529)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 4 martie 2018 16:37:01
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100001

using namespace std;

int n,m,p,a,b,st,dr,mij;
int lv[MAX],s[MAX][17];
vector<int> nd[MAX];
void parcurge(int nod,int niv){
  lv[nod]=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);
    for(int i=1;i<=16;i++)for(int j=1;j<=n;j++)s[j][i]=s[s[j][i-1]][i-1];
    parcurge(1,1);
    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;
}