Cod sursa(job #2285922)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 19 noiembrie 2018 15:31:18
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int> v[100001];
int nivel[100001],e[4000001],poz[100001];
int log[4000001];
int rmq[23][4000001];
int ne=0;
void dfs(int nod)
{
 e[++ne]=nod;
 poz[nod]=ne;
 for(int i=0;i<v[nod].size();i++)
 {
  nivel[v[nod][i]]=nivel[nod]+1;
  dfs(v[nod][i]);
  e[++ne]=nod;
 }
}
int main()
{
    int n,k,i,x,j,a,b,y,l;
    in>>n>>k;
    for(i=2;i<=n;i++)
    {
     in>>x;
     v[x].push_back(i);
    }
    dfs(1);
    for(i=1;i<=ne;i++)
        rmq[0][i]=e[i];
    for(i=2;i<=ne;i++)
        log[i]=log[i/2]+1;
        for(i=1;i<=log[ne];i++)
            for(j=(1<<i);j<=ne;j++)
            {
            rmq[i][j]=rmq[i-1][j];
            if(nivel[rmq[i][j]]>nivel[rmq[i-1][j-(1<<(i-1))]])
            rmq[i][j]=rmq[i-1][j-(1<<(i-1))];
            }

    for(i=1;i<=k;i++)
    {
     in>>a>>b;
     x=poz[b];
     y=poz[a];
     if(x<y)
        swap(x,y);
     l=log[x-y+1];
     out<<min(rmq[l][x],rmq[l][y+(1<<l)-1])<<'\n';
    }
    return 0;
}