Cod sursa(job #2393126)

Utilizator smoc_georgemarianSmoc George-Marian smoc_georgemarian Data 30 martie 2019 21:18:37
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,nrc=1;
vector < int> g[NMAX];

 int ap[2*NMAX];
 int level[2*NMAX];
 int euler[NMAX*2];
  bool uz[2*NMAX];
 int rmql[2*NMAX-1][20];

void dfs(int k,int lvl);
void citire();

int main()
{citire();
    return 0;
}
void citire()
{int x,ant,i,j,y;
 fin>>n>>m;

 ant=0;
 for(i=2;i<=n;i++)
    {
      fin>>x;
      g[x].push_back(i);
      g[i].push_back(x);
    }

  dfs(1,0);
//for(i=1;i<=nrc;i++)
  //  fout<<euler[i]<<" ";
 //fout<<'\n';
 for(i=1;i<=2*n-1;i++)
     rmql[i][0]=euler[i];
 for(i=1;i<=2*n-1;i++)
        for(j=1;(1<<j)<=i;j++)
            { if(   level[  rmql[i][j-1]  ]  <  level[  rmql[i-(1<<(j-1) ) ][j-1]    ]  )
                rmql[i][j]=rmql[i][j-1];
                else
                 rmql[i][j]=rmql[i-(1<<(j-1)  )][j-1];
            }
  //for(i=1;i<=2*n-1;i++)
    //fout<<rmql[i][1]<<" ";
for(int ct=1;ct<=m;ct++)
        {
         fin>>x>>y;
         if(x==y)
            fout<<x<<'\n';
           else
         {i=min(ap[x],ap[y]);
         j=max(ap[y],ap[x]);
         int k=log2(j-i+1);

         if(level[rmql[j   ][k]]<level[rmql[i+(1<<k)][k]]   )
            fout<<rmql[j][k]<<'\n';
          else
            fout<<rmql[i+(1<<k)][k]<<'\n';
         }
        }

}
void dfs(int k,int lvl)
{
 int i;
 uz[k]=1;
 if(!ap[k] && k!=1)
    ap[k]=nrc;

 level[k]=lvl;
 euler[nrc]=k;

 for(i=0;i<g[k].size();i++)
    if(!uz[g[k][i]])
    {
     nrc++;
     dfs(g[k][i],lvl+1);

    if(g[k].size()>1)///inseamna ca am revenit
        nrc++,  euler[nrc]=k;
    }

}