Cod sursa(job #2646497)

Utilizator numecompletnume complet numecomplet Data 1 septembrie 2020 13:03:29
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define NMAX 100009
#define HMAX 23
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> g[NMAX];
int n,m;
bool uz[NMAX];
int lg;
int sir[2*NMAX];
int lvl[2*NMAX];
int first[NMAX];
int r[2*NMAX][HMAX];
void citire();
void dfs(int k, int niv);
void rmq();
void lca();
int main()
{
  citire();
  dfs(1,0);
  rmq();
  lca();
    return 0;
}
void citire()
{int x,i;
  fin>>n>>m;
  for(i=2;i<=n;i++)
    {
     fin>>x;
     g[x].push_back(i);
    }
}
void dfs(int k,int niv)
{
  int i;
  sir[++lg]=k;
  lvl[lg]=niv;
  first[k]=lg;
  for(i=0;i<g[k].size();i++)
    {
     int act=g[k][i];

     dfs(act,niv+1);
     sir[++lg]=k;
     lvl[lg]=niv;
    }
}
void rmq()
{
  int i,j;
  for(i=1;i<=lg;i++)
    {
     r[i][0]=i;
    }
   for(i=1; (1<<i)<=lg;i++)
        for(j=1;   j+(1<<i)-1  <=lg;j++)
            if(  lvl[r[j][i-1 ]]  < lvl[ r[j+ (1<<(i-1)) ][i-1]]    )
            {
              r[j][i]=r[j][i-1 ];
            }
            else
                r[j][i ]=r[j+ (1<<(i-1))][i-1 ];

}
void lca()
{int i;
 int x,y;
    for(i=1;i<=m;i++)
        {
         fin >>x>>y;
         x=first[x];
         y=first[y];
         if(x>y)
            swap(x,y);
         int care= log2(y-x+1);
         fout<<care<<" ";
         int sol=0;
         if( lvl[ r[x][care]  ] <lvl [r  [y-  (1<<care)+1][care]]   )
           sol=r[x][care];
           else
            sol=r  [y-  (1<<care)+1][care];
           fout<<sir[sol]<<'\n';

        }
}