Cod sursa(job #2416797)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 28 aprilie 2019 11:28:52
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,cate;
vector <int> g[NMAX];
int ind[NMAX];
int euler[2*NMAX];
bool uz[NMAX];

int M[2*NMAX][30];
int level[2*NMAX];
//int h[NMAX];

void citire();
void dfs(int k, int niv);
void constr();
void quest();
int main()
{citire();
 dfs(1,1);
 constr();
 quest();
    return 0;
}
void citire()
{int i,tata;
 fin>>n>>m;
 for(i=2;i<=n;i++)
    {
     fin>>tata;
     g[tata].push_back(i);
     g[i].push_back(tata);
    }

}
void dfs(int k ,int niv)
{int i;
  cate++;
  euler[cate]=k;
  level[cate]=niv;
  if(!ind[k])
    ind[k]=cate;
  uz[k]=1;
  for(i=0;i<g[k].size();i++)
    if(!uz[g[k][i]])
    {

       dfs(g[k][i],niv+1);
       euler[++cate]=k;
       level[cate]=niv;
    }


}
void constr()
{
 int i,j;
 for(i=1;i<=2*n-1;i++)
        M[i][0]=i;
 for(j=1;(1<<j)<=2*n-1;j++)
            for(i=1;i+ (1<<j)-1<=2*n-1;i++)
                 if(level[M[i][j-1]]<level[ M[i+(1<<(j-1))][j-1] ])
                   M[i][j]=M[i][j-1];
                   else
                    M[i][j]=M[i+(1<<(j-1))][j-1];
}
void quest()
{int x,y;
 int i;
 for(i=1;i<=m;i++)
    {
    fin>>x>>y;
     x=ind[x];
     y=ind[y];
     if(x<y)
        swap(x,y);
     int k=log2(x-y+1);
     if(level[M[y][k]]<level[M[x-(1<<k)+1][k]])
        fout<<euler[M[y][k]]<<'\n';
        else
         fout<<euler[M[x-(1<<k)+1][k]]<<'\n';
    }
}