Cod sursa(job #2394874)

Utilizator ApetriiRaduApetrii Radu ApetriiRadu Data 2 aprilie 2019 00:32:39
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
#define NMAX 100005
#define LMAX 20
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

vector<int> G[NMAX];
int tata[NMAX];
int M[2*NMAX][LMAX];
int n,m;
int euler[2*NMAX],lg;
int level[2*NMAX];
int index[NMAX];
int h[NMAX];
bool uz[NMAX];

void citire();
void parcurgere_euler();
void dfs(int x);
void constr();
void rezolv();
int main()
{citire();
 parcurgere_euler();
 constr();
 rezolv();
 /*for(i=1;i<=m;i++)
    {fin>>x>>y;
     fout<<euler[RMQ(index[x],index[y])]<<'\n';
    }*/
}
void citire()
{int i;
 fin>>n>>m;
 for(i=1;i<n;i++)
    {fin>>tata[i];
     G[i+1].push_back(tata[i]);
     G[tata[i]].push_back(i+1);
    }
}
void parcurgere_euler()
{dfs(1);
}
void dfs(int x)
{int i;
 uz[x]=1;
 lg++;
 euler[lg]=x;
 level[lg]=h[x];
 if(!index[x])
    index[x]=lg;
 for(i=0;i<G[x].size();i++)
    if(!uz[G[x][i]])
      {h[G[x][i]]=h[x]+1;
       dfs(G[x][i]);
       lg++;
       euler[lg]=x;
       level[lg]=h[x];
      }
}
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)<=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 rezolv()
{int i,k,x,y;
 for(i=1;i<=m;i++)
    {fin>>x>>y;
     x=index[x];
     y=index[y];
     if(x<y)
        swap(x,y);
     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';
    }
}