Cod sursa(job #2151351)

Utilizator catalinlupCatalin Lupau catalinlup Data 4 martie 2018 13:23:11
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
#define INFILE "lca.in"
#define OUTFILE "lca.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
const int NMAX=100010;
const int LOGNMAX=23;
typedef array<int,NMAX> vec;
typedef array<array<int,LOGNMAX>,NMAX> vec2;

void Procesare(vec2& P,vec& T,int N){
  for(int i=0;i<N;i++){
    for(int j=0;(1<<j)<N;j++){
      P[i][j]=-1;
    }
  }
  for(int i=0;i<N;i++){
    P[i][0]=T[i];
  }
  for(int j=1;(1<<j)<N;j++){
    for(int i=0;i<N;i++){
      if(P[i][j-1]!=-1){
        P[i][j]=P[P[i][j-1]][j-1];
      }
    }
  }
}

int Query(vec& L,vec& T,vec2& P,int N, int p, int q){
  int lg;
  if(L[p]<L[q])
    swap(p,q);
  for(lg=1;(1<<lg)<=L[p];lg++);
  lg--;
  //cout<<lg<<"\n";
  for(int i=lg;i>=0;i--){
    if(L[p]-(1<<i)>=L[q])
      p=P[p][i];
  }
  if(p==q)
    return q;
  for(int i=lg;i>=0;i--){
    if(P[p][i]!=-1&&P[p][i]!=P[q][i]){
      p=P[p][i];
      q=P[q][i];
    }
  }
  return T[p];
}
vec T;
vec2 P;
vec L;
int N,M;
void Read(){
  in>>N>>M;
  for(int i=2;i<=N;i++){
    int x;
    in>>x;
    T[i-1]=x-1;
    L[i-1]=1+L[x-1];
  }
}
void Determinare(){
  Procesare(P,T,N);
  /*for(int i=0;i<N;i++)
      cout<<i<<": "<<T[i]<<" "<<L[i]<<"\n";*/
  //cout<<Query(L,T,P,N,9,10)<<"\n";
  for(int i=1;i<=M;i++){
    int x,y;
    in>>x>>y;
    out<<Query(L,T,P,N,x-1,y-1)+1<<"\n";
  }

}

int main(){
  Read();
  Determinare();
}