Cod sursa(job #2983406)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 22 februarie 2023 13:31:13
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include<fstream>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;

ifstream cin("lca.in");
ofstream cout("lca.out");

const int NMAX = 1e5 + 1;
const int QMAX =  2000000;

bitset<NMAX> viz;
vector<int> vecini[NMAX];
vector<pair<int,int>> query[NMAX];
int ans[QMAX],t[NMAX];

int root(int nod)
{
    return t[nod] ? t[nod] = root(t[nod]) : nod;
}

void dfs(int nod)
{
    for(auto it : vecini[nod]) dfs(it),t[it] = nod; viz[nod] = 1;
    for(auto it : query[nod])
        {
            if(!viz[it.first]) continue;
            ans[it.second] = root(it.first);
        }
}

int main()
{
    int n,q,a,b; cin >> n >> q;
    for(int i = 2; i <= n ; i++)
        {
            cin >> a;
            vecini[a].emplace_back(i);
        }

    for(int i = 1; i <= q ; i++)
        {
            cin >> a >> b;
            query[a].push_back({b,i});
            query[b].push_back({a,i});
        }

    dfs(1);
    for(int i = 1; i <= q ; i++) cout << ans[i] << '\n';
}