Cod sursa(job #3254212)

Utilizator daryufDaryuF daryuf Data 6 noiembrie 2024 16:47:15
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>//DaryuF
#define ll long long
#define pb push_back
#define fi first
#define se second
#define pii pair <int,int>
#define MOD 777013
#define e exit(0)
using namespace std;
const string file = "lca";
ifstream in(file + ".in");
ofstream out(file + ".out");
#define cin in
#define cout out
const int NMAX = 100001;
int n, q, rmq[2*NMAX][17], lg2[2*NMAX], t[NMAX],euler[2*NMAX],niv[2*NMAX],poz[NMAX],m,v[NMAX];
vector <int>gf[NMAX];
void dfs(int nod)
{
    euler[++m] = nod;
    niv[m] = nod;
    poz[nod] = m;
    for(auto i:gf[nod])
    {
            dfs(i);
          euler[++m] = nod;
          niv[m] = nod;
    }
}
void build_rmq()
{
    for(int i=2;i<=m;i++)
        lg2[i] = lg2[i>>1] + 1;
    for(int i=1;i<=m;i++)
        rmq[i][0] = i;
    for(int j=1;(1<<j)<=m;j++)
        for(int i=1;i+(1<<j)-1<=m;i++)
    {
        rmq[i][j] = min(niv[rmq[i][j-1]],niv[rmq[i+(1<<j-1)][j-1]]);
    }
}
int lca(int x,int y)
{
    x = poz[x], y = poz[y];
    int l = lg2[y-x+1];
    int a = rmq[x][l], b = rmq[y-(1<<l)+1][l];
    if(niv[a]> niv[b])
        return euler[b];
    else return euler[a];
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> q;
for(int i=2;i<=n;i++)
    {
        int x;
        cin >> x;
        gf[x].pb(i);
    }
dfs(1);
build_rmq();
while(q--)
{
    int x, y;
    cin >> x >> y;
    cout << lca(x,y) << '\n';
}
    return 0;
}