Cod sursa(job #3214344)

Utilizator PiciuAndreiAlinPiciu Andrei Alin PiciuAndreiAlin Data 14 martie 2024 08:17:07
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, Q;
int expo[200005], e[200005], P[100003], niv[200005];
int rmq[20][200005];
vector<int>L[100003];
void DFS(int k, int level)
{
    m++;
    niv[m] = level;
    e[m] = k;
    P[k] = m;
    for(int i : L[k])
    {
        DFS(i, level + 1);
        m++;
        niv[m] = level;
        e[m] = k;
    }
}
void MakeE()
{
    int i;
    expo[1] = 0;
    for(i = 2; i <= m; i++)
        expo[i] = 1 + expo[i / 2];
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int i, l, x, y, j;
    int A, B, rez;
    fin >> n >> Q;
    for(i = 2; i <= n; i++)
    {
        fin >> j;
        L[j].push_back(i);
    }
    DFS(1, 1);
    MakeE();
    for(i = 1; i <= m; i++)
        rmq[0][i] = i;
    for(i = 1; i <= m; i++)
    {
        l = (1 << i);
        for(j = 1; j <= m - l + 1; j++)
        {
            A = rmq[i - 1][j];
            B = rmq[i - 1][j + l / 2];
            if(niv[A] <= niv[B])
                rmq[i][j] = A;
            else rmq[i][j] = B;
        }
    }
    for(i = 1; i <= Q; i++)
    {
        fin >> x >> y;
        x = P[x];
        y = P[y];
        if(x > y)
            swap(x, y);
        int t = expo[y - x + 1];
        l = (1 << t);
        A = rmq[t][x];
        B = rmq[t][y - l + 1];
        if(niv[A] <= niv[B])
            rez = A;
        else rez = B;
        fout << e[rez] << "\n";
    }
    return 0;
}