Cod sursa(job #2922194)

Utilizator PopaMihaimihai popa PopaMihai Data 5 septembrie 2022 19:39:43
Problema Lowest Common Ancestor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 1e5 + 4;

int N, Q;

vector < int > G[NMAX];
int Next[20][NMAX];
int Level[NMAX];

void DFS(int node, int daddy, int level)
{
    Level[node] = level;

    Next[0][node] = daddy;
    for(int i = 1; (1 << i) <= N; ++i)
        Next[i][node] = Next[i - 1][Next[i - 1][node]];

    for(auto it: G[node])
        if(it != daddy)
            DFS(it, node, level + 1);
}

int Query(int a, int b)
{
    if(Level[b] > Level[a])
        swap(a, b);

    int delta = Level[a] - Level[b];

    for(int i = 0; (1 << i) <= delta; ++i)
        if((delta >> i) & 1)
            a = Next[i][a];

    if(a == b)
        return a;

    for(int i = 20; i >= 0; --i)
        if(Next[i][a] != Next[i][b])
            a = Next[i][a], b = Next[i][b];

    return Next[0][a];
}

void Solve()
{
    fin >> N >> Q;

    for(int i = 2; i <= N; ++i) {
        int a;
        fin >> a;
        G[a].push_back(i);
        G[i].push_back(a);
    }

    DFS(1, 0, 0);

    for(int i = 1; i <= Q; ++i) {
        int x, y;
        fin >> x >> y;
        fout << Query(x, y) << '\n';
    }
}

int main()
{
    Solve();
    return 0;
}