Cod sursa(job #2581864)

Utilizator AlexandruBrezuleanuAlexandruBrezuleanu AlexandruBrezuleanu Data 15 martie 2020 21:28:13
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
#define MAX 100100
#define MAX2 200100
#define LOGG 21
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int>g[MAX];
int euler[MAX2],level[MAX2],ind[MAX];
int c[MAX2][LOGG];
bool uz[MAX];
int n,m,nr=1,lvl=0;
void rd();
void dfs(int node);
void rmq();
int main()
{
    int i,k,x,y;
    rd();
    uz[1]=1;
    dfs(1);
    rmq();
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        if(ind[x]>ind[y])
            swap(x,y);
        k=log2(ind[y]-ind[x]+1);
        if(level[c[ind[x]][k]]<level[c[ind[y]-(1<<k)+1][k]])
            fout<<euler[c[ind[x]][k]]<<'\n';
        else
            fout<<euler[c[ind[y]-(1<<k)+1][k]]<<'\n';
    }
    return 0;
}
void rd()
{
    int i,x;
    fin>>n>>m;
    for(i=1;i<n;i++)
    {
        fin>>x;
        g[x].push_back(i+1);
        g[i+1].push_back(x);
    }
}
void dfs(int node)
{
  int i;
  euler[nr]=node;
  level[nr]=lvl;
  if(!ind[node])
    ind[node]=nr;
  nr++;
  for(i=0;i<g[node].size();i++)
    if(!uz[g[node][i]])
  {
      uz[g[node][i]]=1;
      lvl++;
      dfs(g[node][i]);
      lvl--;
      euler[nr]=node;
      level[nr]=lvl;
      nr++;
  }
}
void rmq()
{
    int n1,i,j;
    n1=2*n-1;
    for(i=1;i<=n1;i++)
        c[i][0]=i;
    for(j=1;(1<<j)<=n1;j++)
        for(i=1;i+(1<<j)-1<=n1;i++)
        if(level[c[i][j-1]]<level[c[i+(1<<(j-1))][j-1]])
        c[i][j]=c[i][j-1];
        else
            c[i][j]=c[i+(1<<(j-1))][j-1];
}