Pagini recente » Cod sursa (job #2859470) | Cod sursa (job #1935730) | Cod sursa (job #708672) | Cod sursa (job #1312958) | Cod sursa (job #2857015)
#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 enter[nmax+5], ies[nmax+5];
bool viz[nmax+5];
int t;
void dfs(int node) {
enter[node] = ++t;
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])
dfs(i);
ies[node] = ++t;
}
bool stramos(int a, int b) {
if(enter[a]<enter[b] and ies[a]>ies[b]) return true;
return false;
}
int lca(int a, int b) {
if(stramos(a,b))
return a;
if(stramos(b,a))
return b;
for(int i=lg; i>=0; i--)
if(!stramos(lift[a][i],b))
a = lift[a][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;
}
dfs(1);
enter[0] = 0;
ies[0] = 1e9;
for(int i=1; i<=m; i++) {
int a,b; f >> a >> b;
g << lca(a,b) << "\n";
}
return 0;
}