Cod sursa(job #3168760)

Utilizator matei0000Neacsu Matei matei0000 Data 13 noiembrie 2023 11:18:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.73 kb
#include <bits/stdc++.h>
using namespace std;
int n, q, d[20][100005], a[100005];
vector<int> k[100005];
ifstream y("lca.in");
ofstream t("lca.out");
void g(int nod){a[nod] = a[d[0][nod]] + 1;for(auto i : k[nod])g(i);}
void p(){for(int bit = 1; bit < 20; bit ++)for(int j = 1; j <= n; j ++)d[bit][j] = d[bit - 1][d[bit - 1][j]];}
int lca(int u, int v){if(a[u] > a[v])swap(u, v);int bit = 19;while(bit >= 0){if(a[v] - (1 << bit) >= a[u])v = d[bit][v];bit --;}if(u == v)return v;bit = 19;while(bit >= 0){if(d[bit][u] != d[bit][v])v = d[bit][v], u = d[bit][u];bit --;}return d[0][v];}
int main(){y >> n >> q;for(int i = 2; i <= n; i ++)y >> d[0][i], k[d[0][i]].push_back(i);p();g(1);while(q --){int u, v;y >> u >> v;t << lca(u, v) << '\n';}}