Pagini recente » Cod sursa (job #2698089) | Cod sursa (job #1379109) | Cod sursa (job #2494179) | Cod sursa (job #2734149) | Cod sursa (job #2499637)
#include <bits/stdc++.h>
#define DIM 100005
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, m, k, i, j, a, b, x, y;
int e[2*DIM], nivel[2*DIM], l[2*DIM], first[DIM];
int d[20][2*DIM];
vector <int> L[DIM];
void euler (int nod, int niv){
int vecin;
e[++k] = nod;
nivel[k] = niv;
first[nod] = k;
for (int i=0; i<L[nod].size(); i++){
vecin = L[nod][i];
euler (vecin, niv + 1);
e[++k] = nod;
nivel[k] = niv;
}
}
int main(){
fin >> n >> m;
for (i=1; i<=n-1; i++){
fin >> a;
L[a].push_back(i+1);
}
euler(1, 1);
l[1] = 0;
for (i=2; i<=k; i++){
l[i] = l[i/2] + 1;
}
for (i=1; i<=k; i++){
d[0][i] = i;
}
for (i=1; i<=l[k]+1; i++){
for (j=1; j<=k; j++){
d[i][j] = d[i-1][j];
if (j+(1<<(i-1)) <= k && nivel[d[i][j]] > nivel[d[i-1][j+(1<<(i-1))]]){
d[i][j] = d[i-1][j+(1<<(i-1))];
}
}
}
for (i=1; i<=m; i++){
fin >> x >> y;
x = first[x], y = first[y];
a = min (x, y), b = max (x, y);
k = l[b-a+1];
if (nivel[d[k][a]] < nivel[d[k][b-(1<<k)+1]]){
fout << e[d[k][a]] << "\n";
}
else{
fout << e[d[k][b-(1<<k)+1]] << "\n";
}
}
return 0;
}