Pagini recente » Cod sursa (job #2214513) | Cod sursa (job #1475369) | Cod sursa (job #187094) | Cod sursa (job #624136) | Cod sursa (job #2877832)
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define dbg(x) cout << #x <<": " << x << "\n";
using ll = long long;
const string fn = "lca";
ifstream fin(fn + ".in");
ofstream fout(fn + ".out");
const int mxn = 100000;
int n, q;
int ans[2000005];
int dad[mxn + 5];
vector<int> g[mxn + 5];
vector<pair<int, int> > qs[mxn + 5];
bitset < mxn + 5 > viz;
int find(int x) {
return dad[x] != x ? dad[x] = find(dad[x]) : x;
}
void unionn(int x, int y) {
dad[find(y)] = dad[find(x)];
}
void dfs(int nod) {
viz[nod] = 1;
dad[nod] = nod;
for (auto i : g[nod]) {
if (!viz[i]) {
dfs(i);
unionn(nod, i);
dbg(nod)
// dbg(find(nod));
// dad[find(nod)] = nod;
}
}
for (auto i : qs[nod])
if (viz[i.first])
ans[i.second] = dad[find(i.first)];
}
int main() {
fin >> n >> q;
for (int i = 2; i <= n ; ++i) {
int x;
fin >> x;
g[x].pb(i);
}
for (int i = 1; i <= q; ++i) {
int x, y;
fin >> x >> y;
qs[x].pb({y, i});
qs[y].pb({x, i});
}
dfs(1);
for (int i = 1; i <= q; ++i)
fout << ans[i] << "\n";
return 0;
}