Pagini recente » Cod sursa (job #1475382) | Cod sursa (job #2514525) | Cod sursa (job #1532793) | Cod sursa (job #1957925) | Cod sursa (job #2565433)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, m, nrE, i, sol, j, x, y, a, b, k;
int eu[500005], f[100005], first[100005], l[500005];
int rmq[500005][20];
vector <int> L[100005];
void euler (int nod){
int vecin;
f[nod] = 1;
for (int i=0; i<L[nod].size(); i++){
vecin = L[nod][i];
if (f[vecin] == 0){
euler (vecin);
}
eu[++nrE] = nod;
}
}
int main(){
fin >> n >> m;
for (i=1; i<=n-1; i++){
fin >> x;
L[x].push_back (i+1);
L[i+1].push_back (x);
}
eu[++nrE] = 1;
first[1] = 1;
euler (1);
for (i=1; i<=nrE; i++){
if (first[eu[i]] == 0)
first[eu[i]] = i;
}
l[1] = 1;
for (i=2; i<=nrE; i++){
l[i] = l[i/2] + 1;
}
for (i=1; i<=nrE; i++){
l[i]--;
}
for (i=1; i<=nrE; i++){
rmq[i][0] = i;
}
for (j=1; (1<<j) <= nrE; j++){
for (i=1; i + (1<<j) - 1 <= nrE; i++){
if (eu[rmq[i][j-1]] <= eu[rmq[i+(1<<(j-1))][j-1]]){
rmq[i][j] = rmq[i][j-1];
}
else{
rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
}
}
}
for (i=1; i<=m; i++){
fin >> x >> y;
a = min (first[x], first[y]);
b = max (first[x], first[y]);
k = l[b-a+1];
sol = INT_MAX;
sol = min (eu[rmq[a][k]], eu[rmq[b-(1<<(k))+1][k]]);
fout << sol << "\n";
}
return 0;
}