Pagini recente » Cod sursa (job #2685559) | Cod sursa (job #1382818) | Cod sursa (job #309935) | Cod sursa (job #2450481) | Cod sursa (job #1872563)
#include <bits/stdc++.h>
using namespace std;
constexpr int maxn = 1e5 + 1000, maxq = 2e6 + 10;
vector<int> fii[maxn] = {};
int n, q, tata[maxn] = {}, rk[maxn] = {}, val[maxn], rez[maxq] = {};
bitset<maxn> viz = 0;
vector<pair<int, int*>> qs[maxn] = {};
int find(const int x){
return tata[x] ? tata[x] = find(tata[x]) : x; }
int merge(int x, int y){
x = find(x), y = find(y);
if(x == y) return x;
if(rk[x] > rk[y]) swap(x, y);
if(rk[x] == rk[y]) ++rk[y];
return tata[y] = x; }
void dfs(const int cur = 1){
viz[cur] = 1;
val[cur] = cur;
for(const auto query : qs[cur]){
if(!viz[query.first]) continue;
*(query.second) = val[find(query.first)]; }
for(const auto next : fii[cur]){
dfs(next);
val[merge(cur, next)] = cur; } }
ifstream f("lca.in");
ofstream g("lca.out");
int main(){
f >> n >> q;
for(int i = 2, x; i <= n; ++i){
f >> x;
fii[x].push_back(i); }
for(int i = 0, x, y; i < q; ++i){
f >> x >> y;
qs[x].emplace_back(y, rez+i);
qs[y].emplace_back(x, rez+i); }
dfs();
copy_n(rez, q, ostream_iterator<int>(g, "\n"));
return 0; }