Pagini recente » Cod sursa (job #2353502) | Cod sursa (job #1441907) | Cod sursa (job #337934) | Cod sursa (job #2061252) | Cod sursa (job #2857003)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
const int lg = 17;
vector<vector<int>> dx(nmax+5);
int lift[nmax+5][lg+5];
int niv[nmax+5];
bool viz[nmax+5];
void dfs(int node) {
viz[node] = true;
for(int i=1; i<=lg; i++)
lift[node][i] = lift[lift[node][i-1]][i-1];
for(auto i : dx[node])
if(!viz[i]) {
niv[i] = niv[node] + 1;
dfs(i);
}
}
int lca(int a, int b) {
// a <
if(niv[a] < niv[b]) swap(a,b);
for(int i=lg; i>=0; i--)
if(niv[lift[a][i]]>=niv[b])
a = lift[a][i];
if(a==b) return a;
for(int i=lg; i>=0; i--)
if(lift[a][i]!=lift[b][i]) {
a = lift[a][i];
b = lift[b][i];
}
return lift[a][0];
}
int main () {
ifstream f("lca.in");
ofstream g("lca.out");
int n,m; f >> n >> m;
for(int y=2; y<=n; y++) {
int x; f >> x;
dx[x].emplace_back(y);
dx[y].emplace_back(x);
lift[y][0] = x;
}
niv[1] = 1;
dfs(1);
for(int i=1; i<=m; i++) {
int a,b; f >> a >> b;
g << lca(a,b) << "\n";
}
return 0;
}