Cod sursa(job #2443918)

Utilizator capmareAlexCapmare Alex capmareAlex Data 29 iulie 2019 18:51:55
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m , p, dist[NMAX], lg2[NMAX*2], first[NMAX];
vector < int  > v[NMAX];

pair < int, int > q[NMAX*2];
pair < int, int > pd[20][NMAX*2];
void dfs(int nod, int pred)
{
    dist[nod] = dist[pred] + 1;
    pd[0][++p] = {dist[nod], nod};
    first[nod] = p;
     for(auto x : v[nod])
     if(x != pred)
    {
     dfs(x, nod);
      pd[0][++p] = {dist[nod], nod};
    }

}
int query(int a, int b)
{
    if(a == b)
        return a;
    a = first[a];
    b = first[b];
    if( a > b)
        swap(a, b);
    int len = lg2[b-a+1];
    return min(pd[len][a],pd[len][b-(1<<len)+1]).second;
}
int main()
{
    fin>>n>>m;
    for(int i = 2; i <= n; ++i)
    {
        int x;
        fin >> x;
        v[x].push_back(i);
        v[i].push_back(x);
    }
    dfs(1,0);
    lg2[2]=1;
    for( int i =3; i <= p; ++i)
        lg2[i] = lg2[i/2] +1;
    for( int t = 1; (1<<t) <= p; ++t)
        for( int i = 1; i + (1<<t)-1 <= p; ++i)
            pd[t][i] = min(pd[t-1][i], pd[t-1][i + (1<<(t-1))]);
    while(m)
    {
        --m;
      int a, b;
       fin >> a >> b;
       fout<<query(a,b)<<"\n";
    }
    return 0;
}