Cod sursa(job #2153815)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 6 martie 2018 14:46:51
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 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,szi,sp;
int lv[MAX*2],euler[MAX*2],first[MAX],p2[MAX*2];
pair<int,int> s[MAX*2][18],ans;
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);
  szi=dr-st+1;
  ans=min(s[st][p2[szi]],s[dr-(1<<p2[szi])+1][p2[szi]]);
  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(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(sp=0;sp<=17;sp++) for(int i=(1<<sp);i<=sz&&i<(1<<(sp+1));i++)p2[i]=sp;
    for(int i=1;i<=m;i++) f>>a>>b,g<<rmq(first[a],first[b])<<'\n';
    f.close();
    g.close();
    return 0;
}