Pagini recente » Cod sursa (job #3363741) | Cod sursa (job #1421846) | Cod sursa (job #3363382) | Cod sursa (job #3363592) | Cod sursa (job #3363645)
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int nmax = 100'000, qmax = 2'000'000;
int ans[qmax];
int p[nmax];
bool viz[nmax];
vector<int> adj[nmax];
vector<pair<int, int>> qu[nmax];
int find(int u) {
if(u == p[u])
return u;
return p[u] = find(p[u]);
}
void join(int u, int v) {
p[find(v)] = find(u);
}
void dfs(int u = 0) {
viz[u] = true;
for(auto [v, i] : qu[u]) {
if(viz[v]) ans[i] = find(v);
}
for(auto v : adj[u]) {
dfs(v);
join(u, v);
}
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, q; cin >> n >> q;
for(int i = 1; i < n; i ++) {
int u; cin >> u; u --;
adj[u].pb(i);
}
for(int i = 0; i < q; i ++) {
int u, v; cin >> u >> v; u --; v --;
qu[u].pb({v, i}), qu[v].pb({u, i});
}
iota(p, p + n, 0);
dfs();
for(int i = 0; i < q; i ++) {
cout << 1 + ans[i] << '\n';
}
}