Pagini recente » Cod sursa (job #2569251) | Cod sursa (job #3310624) | Cod sursa (job #3306230) | Cod sursa (job #3310842) | Cod sursa (job #3346213)
#include <bits/stdc++.h>
using namespace std;
struct tarjan{
int source, dest, index_result;
};;
vector <int> G[100001];
vector <tarjan> E[100001];
tarjan queries[2000001];
int f[100001], disjoint[100001];
int find(int x){
if(disjoint[x] == x) return x;
return disjoint[x] = find(disjoint[x]);
}
void dfs(int i){
disjoint[i] = find(disjoint[i]);
f[i] = 1;
for(auto it : G[i]){
if(!f[it]){
dfs(it);
int rit = find(disjoint[it]);
int ri = find(disjoint[i]);
disjoint[rit] = ri;
}
}
f[i] = 2;
for(auto [_, j, index]: E[i])
if(f[j] == 2){
queries[index].index_result = disjoint[j] = find(disjoint[j]);
}
}
int main() {
int n, m;
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 2; i <= n; i++){
int x;
scanf("%d", &x);
G[i].push_back(x);
G[x].push_back(i);
disjoint[i] = i;
}
disjoint[1] = 1;
for(int i = 1; i <= m; i++){
scanf("%d%d", &queries[i].source, &queries[i].dest);
E[queries[i].source].push_back({0, queries[i].dest, i});
E[queries[i].dest].push_back({0, queries[i].source, i});
}
dfs(1);
for(int i = 1; i <= m; i++)
printf("%d\n", queries[i].index_result);
return 0;
}