Cod sursa(job #2169851)

Utilizator filip.mihalutMihalut Filip filip.mihalut Data 14 martie 2018 18:16:26
Problema Lowest Common Ancestor Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
#define Nmax 100005

using namespace std;

ifstream f ("lca.in");
ofstream g ("lca.out");

int a[10][2*Nmax] , poz , first[Nmax],i,n,m,j,x,y,t,k,poz_st,poz_dr;
pair < int,int > euler[2*Nmax];
vector < int > v[Nmax];

inline void bfs(int nod,int niv)
{
    int l = v[nod].size(),next_nod; euler[++poz] = {nod,niv};

    if(not first[nod])
        first[nod] = poz;

    for(int i = 0;i < l;i++)
    {
        next_nod = v[nod][i];
        bfs(next_nod , niv + 1);
        euler[++poz] = {nod,niv};
    }
}

inline void rmq()
{
    for(i = 1;i <= poz;i++)
        a[0][i] = i;

    k = 1;
    m = log2(poz);

    for(i = 1;i <= m;i++)
    {
        for(j = 1;j <= poz - 2*k + 1;j++)
        {
            poz_st = a[i - 1][j]; poz_dr = a[i - 1][j + k];
            if(euler[poz_st].second < euler[poz_dr].second)
                a[i][j] = poz_st;
            else a[i][j] = poz_dr;
        }
        k *= 2;
    }
}

int main()
{
    f >> n >> t;
    for(i = 2;i <= n;i++)
        f >> x,v[x].push_back(i);

    bfs(1,1);
    rmq();

    for(i = 1;i <= t;i++)
    {
        f >> x >> y;
        x = first[x];
        y = first[y];
        if(x > y)
            swap(x,y);

        k = log2(y - x + 1);
        m = pow(2,k);
        poz_st = a[k][x];
        poz_dr = a[k][y - m + 1];
        if(euler[poz_st].second < euler[poz_dr].second)
            g << euler[poz_st].first << '\n';
        else g << euler[poz_dr].first << '\n';
    }

    return 0;
}