Cod sursa(job #2960076)

Utilizator PalcPalcu Stefan Palc Data 3 ianuarie 2023 15:40:01
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.59 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

int n, Q, k;
int rmq[22][2000005];
int e[2000005], poz[100005], lvl[2000005], l2[2000005];
vector<int> a[100005];

void DFS(int x, int niv)
{
    e[++k] = x;
    poz[x] = k;
    lvl[k] = niv;
    for (auto w : a[x])
    {
        DFS(w, niv + 1);
        e[++k] = x;
        lvl[k] = niv;
    }
}

int main()
{
    int x, y, lg;
    fin >> n >> Q;
    for (int i = 2; i <= n; i++)
    {
        fin >> x;
        a[x].push_back(i);
    }
    DFS(1, 0);
    l2[1] = 0;
    for (int i = 2; i <= k; i++)
        l2[i] = l2[i / 2] + 1;
    for (int i = 1; i <= k; i++)
        rmq[0][i] = i;
    for (int i = 1; i <= l2[k]; i++)
        for (int j = 1; j <= k - (1 << i) + 1; j++)
        {
            lg = (1 << (i - 1));
            rmq[i][j] = rmq[i - 1][j];
            if (lvl[rmq[i - 1][j]] > lvl[rmq[i - 1][j + lg]])
                rmq[i][j] = rmq[i - 1][j + lg];
        }
    while (Q--)
    {
        fin >> x >> y;
        x = poz[x];
        y = poz[y];
        if (x > y) swap(x, y);
        lg = l2[y - x + 1];
        if (lvl[rmq[lg][x]] < lvl[rmq[lg][y - (1 << lg) + 1]])
            fout << e[rmq[lg][x]] << "\n";
        else fout << e[rmq[lg][y - (1 << lg) + 1]] << "\n";
    }
}

/**

1 1 1 1 1 1 1 1 1  1   1
1 1 1 2 1 1 1 1 2  1   1   3
1 1 1 2 2 1 3 1 4  2   1   7   3
1 1 1 2 2 2 3 3 4  4   5   7   7   8
1 2 3 4 5 6 7 8 9 10  11  12  13  14


      1 2  3 4 5  6  7  8 9 10 11 12 13 14
poz = 1 2 16 3 9 13 17 23 4  6 10 18 20 24

      1 2 3 4 5  6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
      1 2 4 9 4 10 4 2 5 11  5  2  6  2  1  3  7 12  7 13  7  3  8 14  8  3  1
      0 1 2 3 2  3 2 1 2  3  2  1  2  1  0  1  2  3  2  3  2  1  2  3  2  1  0
i=0=> 1 2 3 4 5  6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
i=1=> 1 2 3 5 5  7 8 8 9 11 12 12 14 15 15 16 17 19 19 21 22 22 23 25 26 27

⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⣤⣤⣤⣤⣶⣦⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⡿⠛⠉⠙⠛⠛⠛⠛⠻⢿⣿⣷⣤⡀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⠋⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠈⢻⣿⣿⡄⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣸⣿⡏⠀⠀⠀⣠⣶⣾⣿⣿⣿⠿⠿⠿⢿⣿⣿⣿⣄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠁⠀⠀⢰⣿⣿⣯⠁⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣷⡄⠀
⠀⠀⣀⣤⣴⣶⣶⣿⡟⠀⠀⠀⢸⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣷⠀
⠀⢰⣿⡟⠋⠉⣹⣿⡇⠀⠀⠀⠘⣿⣿⣿⣿⣷⣦⣤⣤⣤⣶⣶⣶⣶⣿⣿⣿⠀
⠀⢸⣿⡇⠀⠀⣿⣿⡇⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠃⠀
⠀⣸⣿⡇⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠉⠻⠿⣿⣿⣿⣿⡿⠿⠿⠛⢻⣿⡇⠀⠀
⠀⣿⣿⠁⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣧⠀⠀
⠀⣿⣿⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⠀
⠀⣿⣿⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⠀
⠀⢿⣿⡆⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡇⠀⠀
⠀⠸⣿⣧⡀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠃⠀⠀
⠀⠀⠛⢿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⣰⣿⣿⣷⣶⣶⣶⣶⠶⠀⢠⣿⣿⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⣿⣿⡇⠀⣽⣿⡏⠁⠀⠀⢸⣿⡇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⣿⣿⡇⠀⢹⣿⡆⠀⠀⠀⣸⣿⠇⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢿⣿⣦⣄⣀⣠⣴⣿⣿⠁⠀⠈⠻⣿⣿⣿⣿⡿⠏⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⠛⠻⠿⠿⠿⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

*/