Cod sursa(job #3228709)

Utilizator Alex_BerbescuBerbescu Alexandru Alex_Berbescu Data 10 mai 2024 11:46:05
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#pragma GCC optimize("O3")
#pragma GCC optimize("fast-math")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define dim 100005
using namespace std;
int n, queries, v[dim], a, b, rmq[20][dim], k, in[2 * dim], out[2 * dim], ct;
vector<int>noduri[dim];
void dfs(int nod)
{
    in[nod] = ++ct;
    for(auto it : noduri[nod])
    {
        dfs(it);
    }
    out[nod] = ++ct;
}
bool stramos(int x, int y)
{
    return (in[x] <= in[y] && out[x] >= out[y]);
}
int lcab(int x, int y)
{
    if(stramos(x, y))
    {
        return x;
    }
    if(stramos(y, x))
    {
        return y;
    }
    for(int j = k; j >= 0; --j)
    {
        if(rmq[j][x] && !stramos(rmq[j][x], y))
        {
            x = rmq[j][x];
        }
    }
    return rmq[0][x];
}
ifstream fin("lca.in");
ofstream fout("lca.out");
int32_t main(int argc, char * argv[])
{
    fin >> n >> queries;
     k = 18;
     for(int i = 2; i <= n; ++i)
     {
         fin >> v[i];
         noduri[v[i]].push_back(i);
         rmq[0][i] = v[i];
     }
     dfs(1);
     for(int j = 1; j <= k; ++j)
     {
         for(int i = 1; i <= n; ++i)
         {
             rmq[j][i] = rmq[j - 1][rmq[j - 1][i]];
         }
     }
     while(queries--)
     {
         fin >> a >> b;
         fout << lcab(a, b) << '\n';
     }
     return 0;
}