Cod sursa(job #2608255)

Utilizator SochuDarabaneanu Liviu Eugen Sochu Data 30 aprilie 2020 21:29:11
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define lb long double
#define pb push_back
#define val first
#define node second
#define qwerty3 -> first
#define qwerty4 -> second
#define umap unordered_map
#define uset unordered_set
#define pii pair < int , int >

using namespace std;

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

const int N = 100005;
const int M = 1000000007;
const lb PI = acos(-1);

int n , m , x , a , b;
int e[2 * N] , level[N] , first[N];
pii r[2 * N][20];
vector < int > v[N];

int size;

void dfs(int nod , int lev)
{
    e[++size] = nod;
    level[nod] = lev;

    for(int i = 0 ; i < v[nod].size() ; i++)
    {
        dfs(v[nod][i] , lev + 1);
        e[++size] = nod;
    }
}

void rmq()
{
    int i , j;

    for(i = 1 ; i <= 2 * n - 1 ; i++)
        r[i][0] = { level[ e[i] ] , e[i] };

    for(j = 1 ; (1 << j) <= 2 * n - 1 ; j++)
        for(i = 1 ; i + (1 << j) - 1 <= 2 * n - 1 ; i++)
            //r[i][j] =  r[i][j - 1].val < r[i + (1 << (j - 1))[j - 1].val ? r[i][j - 1] : r[i + (1 << (j - 1))[j - 1];
            if(r[i][j - 1].val < r[i + (1 << (j - 1))][j - 1].val)
                r[i][j] = r[i][j - 1];
            else r[i][j] = r[i + (1 << (j - 1))][j - 1];
}

int LCA(int a , int b)
{
    if(first[a] > first[b])
        swap(a , b);

    a = first[a];
    b = first[b];

    int l = log2(b - a);
    return r[a][l].val < r[b - (1 << l) + 1][l].val ? r[a][l].node : r[b - (1 << l) + 1][l].node;
}

int main()
{
    int i;

    f >> n >> m;

    for(i = 2 ; i <= n ; i++)
    {
        f >> x;
        v[x].pb(i);
    }

    dfs(1 , 1);
    rmq();

    for(i = 1 ; i <= 2 * n - 1 ; i++)
        if(!first[ e[i] ])
            first[ e[i] ] = i;

    for(i = 1 ; i <= m ; i++)
    {
        f >> a >> b;
        g << LCA(a , b) << '\n';
    }

    return 0;
}