Cod sursa(job #2327235)

Utilizator horea4Cenan Horea horea4 Data 24 ianuarie 2019 15:36:14
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define DM 100001
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
int n,q,aux;
int E[2*DM+5];
int L[2*DM+5];
int lg[DM+1];
int nr;
int F[DM];
int rmq[DM][19];
vector <int> v[DM];

void a(int b[])
{
    for(int i=1;i<=nr;i++)
        cout<<b[i]<<' ';
    cout<<endl;
}

void dfs(int nod,int level)
{
    E[++nr]=nod;
    L[nod]=level;
    if(!F[nod])
        F[nod]=nr;
    for(auto it:v[nod])
        {
            dfs(it,level+1);
            E[++nr]=nod;

        }
}

void g()
{

    for(int i=1;i<=nr;i++)
        rmq[i][0]=E[i];
    for(int j=1;(1<<j)<=nr;j++)
        for(int i=1;i+(1<<j)<=nr;i++)

           {

                  rmq[i][j]=rmq[i][j-1];
                  if(L[rmq[i+(1<<(j-1))][j-1]] < L[rmq[i][j-1]])
                    rmq[i][j]=rmq[i+(1<<(j-1))][j-1];

           }
    for(int i=2;i<=DM;i++)
        lg[i]=lg[i/2]+1;


}
int query(int a,int b)
{
    if(L[a]>L[b])
        swap(a,b);
    int l=F[b]-F[a]+1;
    l=lg[l];
    a=F[a];
    b=F[b];
    ///query de la F[a] la F[b] in L
    return min(rmq[a][l],rmq[b-(1<<l)+1][l]);


}
int n1,n2;
int main()
{
    fin>>n>>q;
    for(int i=2;i<=n;i++)
    {   fin>>aux;
        v[aux].push_back(i);
    }
    dfs(1,0);
    g();
    for(int i=1;i<=q;i++)
    {
        fin>>n1>>n2;
        fout<<query(n1,n2)<<endl;
    }
  for(int i=1;i<=nr;i++)
  {
        for(int j=0;(1<<j)<=nr;j++)
  {
      cout<<rmq[i][j]<<' ';
  }
  cout<<endl;
  }


    return 0;
}