Cod sursa(job #2639815)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 3 august 2020 23:37:46
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

int n,v[100005],m,x,y,first[100005],nr;
int rmq[20][200005],lg[200005];
vector<int>vecini[100005];
vector<int>euler,nivel;

void prec(){
 lg[1]=0;
 for(int i=2 ; i<2*n ; i++) lg[i] = lg[i/2] + 1;

 for(int i=1 ; i<2*n ; i++) rmq[0][i] = euler[i];

 for(int j=1 ; j<=lg[2*n-1] ; j++)
   for(int i=1 ; i<=2*n-(1<<j) ; i++) rmq[j][i] = min(rmq[j-1][i],rmq[j-1][i+(1<<(j-1))]);
}

void dfs(int nod,int height){
 euler.push_back(nod);
 nivel.push_back(height);
 nr++;
 if(!first[nod]) first[nod]=nr;
 for(int i=0 ; i<vecini[nod].size() ; i++){
   x=vecini[nod][i];
   dfs(x,height+1);
   euler.push_back(nod);
   nivel.push_back(height);
   nr++;
 }
}

int main()
{
 f>>n>>m;
 euler.push_back(10000000);
 nivel.push_back(10000000);
 for(int i=1;i<n;i++){
  f>>v[i];
  vecini[v[i]].push_back(i+1);
 }
 dfs(1,0);
 prec();

 for(int i=1;i<=m;i++){
  f>>x>>y;
  x=first[x];
  y=first[y];
  if(x>y) swap(x,y);
  int lung=y-x+1;
  int ff=lg[lung];
  g<<min( rmq[ff][x],rmq[ff][y+1-(1<<ff)] )<<'\n';
 }
}