Pagini recente » Cod sursa (job #1468302) | Cod sursa (job #2097237) | Cod sursa (job #2334083) | Cod sursa (job #2300828) | Cod sursa (job #2928076)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int NMAX = 1e6;
int t[31][NMAX + 1], ti[NMAX + 1], to[NMAX + 1], emax[NMAX + 1], n, m, x, y, timp;
vector <int> fii[NMAX + 1];
void rmq(){
for(int i = 1; (1 << i) <= n; i++){
for(int j = 1; j <= n; j++){
t[i][j] = t[i - 1][t[i - 1][j]];
if(t[i][j])
emax[j] = i;
}
}
}
void dfs(int x){
ti[x] = ++timp;
for(auto y : fii[x])
dfs(y);
to[x] = ++timp;
}
bool stramos(int x, int y){
return (ti[x] <= ti[y] && to[x] >= to[y]);
}
int lca(int x, int y){
if(stramos(x, y))
return x;
for(int e = emax[x]; e >= 0; e--)
if(t[e][x] && !stramos(t[e][x], y))
x = t[e][x];
return t[0][x];
}
int main(){
cin.tie(0)->sync_with_stdio(0);cout.tie(0);
cin >> n >> m;
for(int i = 2; i <= n; i++){
cin >> t[0][i];
fii[t[0][i]].push_back(i);
}
rmq();
dfs(1);
for(int i = 0; i < m; i++){
cin >> x >> y;
cout << lca(x, y) << "\n";
}
return 0;
}