Cod sursa(job #2153631)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 6 martie 2018 13:05:18
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100001
#define VMAX 1000000000
#define x first
#define y second

using namespace std;

int n,m,p,a,b,sz,i2;
int lv[MAX*2],euler[MAX*2],first[MAX];
pair<int,int> s[MAX*2][18];
vector<int> nd[MAX];
void parcurge(int nod,int niv){
  first[nod]=++sz;
  euler[sz]=nod;
  lv[sz]=niv;
  s[sz][0]=make_pair(niv,nod);
  for(auto i:nd[nod]){
    parcurge(i,niv+1);
    euler[++sz]=nod;
    lv[sz]=niv;
    s[sz][0]=make_pair(niv,nod);
  }
}
int rmq(int st,int dr){
  if(st>dr)swap(st,dr);
  int szi=dr-st+1;
  pair<int,int> ans=make_pair(VMAX,0);
  for(int sp=0;szi;sp++,szi/=2)
    if(szi%2){
      ans=min(ans,s[st][sp]),st+=(1<<sp);
    }
  return ans.y;
}

int main()
{
    ifstream f ("lca.in");
    ofstream g ("lca.out");
    f>>n>>m;
    for(int i=2;i<=n;i++)f>>i2,nd[i2].push_back(i);
    parcurge(1,0);
    for(int sp=1;sp<=17;sp++) for(int i=1;i<=sz;i++)
      s[i][sp]=min(s[i][sp-1],s[min(sz,i+(1<<(sp-1)))][sp-1]);
    for(int i=1;i<=m;i++){
      f>>a>>b;
      g<<rmq(first[a],first[b])<<'\n';
    }
    f.close();
    g.close();
    return 0;
}