Cod sursa(job #2566055)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 2 martie 2020 18:34:27
Problema Lowest Common Ancestor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
#define NMAX 100009
#define LOGMAX 24
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int k, int lvl);
void prel();
int level[2*NMAX];
int rmq[2*NMAX];int lg;
int first[NMAX];
int sol[2*NMAX][LOGMAX];

vector<int>g[NMAX];
int n,m;
int i,j;
int tata;
int main()
{fin>>n>>m;
 for(i=2;i<=n;i++){fin>>tata;
  g[tata].push_back(i);
 }
 dfs(1,1);
 prel();
 for(i=1;i<=m;i++)
    {int st,dr;
      fin>>st>>dr;
      st=first[st];
      dr=first[dr];
      if(st>dr)swap(st,dr);
      int lg=log2(dr-st+1);
      if(level[ sol[st][lg]]<level[ sol[dr- (1<<lg)+1][lg]])
        fout<<rmq[   sol[st][lg]]<<'\n';
      else
          fout<<rmq[  sol[dr- (1<<lg)+1][lg]  ]<<'\n';

    }
    return 0;
}
void dfs(int k, int lvl)
{int i;
  rmq[++lg]=k;
  level[lg]=lvl;
  first[k]=lg;
 for(i=0;i<g[k].size() ;i++)
    {
     dfs(g[k][i],lvl+1);
     rmq[++lg]=k;
     level[lg]=lvl;
    }
}
void prel()
{
  int i,j;
  for(i=1;i<=2*n-1;i++)
      sol[i][0]=i;
    for(j=1;(1<<j)<=2*n-1;j++)
       for(i=1;i<=2*n-1;i++)
          if( level[sol[i][j-1]]    < level[sol[i+ (1<<(j-1))][j-1]]      )
            sol[i][j]=sol[i][j-1];
            else
                sol[i][j]=sol[i+ (1<<(j-1))][j-1];
}