Pagini recente » Cod sursa (job #2043450) | Cod sursa (job #2949265) | Cod sursa (job #1847873) | Cod sursa (job #1187381) | Cod sursa (job #2937063)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
const int logmax = 16;
vector<vector<int>> dx(nmax+5);
int up[nmax+5][logmax+5], niv[nmax+5];
void dfs(int node, int father) {
for(int i=1; i<=logmax; i++)
up[node][i] = up[up[node][i-1]][i-1];
for(auto i : dx[node]) {
if(i == father) continue;
up[i][0] = node;
niv[i] = niv[node] + 1;
dfs(i, node);
}
}
int lca(int a, int b) {
if(niv[a] < niv[b]) swap(a, b);
for(int i=logmax; i>=0; i--)
if(up[a][i] and niv[up[a][i]] >= niv[b])
a = up[a][i];
if(a == b) return a;
for(int i=logmax; i>=0; i--)
if(up[a][i] != up[b][i]) {
a = up[a][i];
b = up[b][i];
}
return up[a][0];
}
int main() {
ifstream f("lca.in");
ofstream g("lca.out");
int n, q; f >> n >> q;
for(int x=2; x<=n; x++) {
int y; f >> y;
dx[x].emplace_back(y);
dx[y].emplace_back(x);
}
dfs(1, 0);
for(int i=1; i<=q; i++) {
int a, b; f >> a >> b;
g << lca(a, b) << "\n";
}
return 0;
}