Pagini recente » Cod sursa (job #2133105) | Cod sursa (job #3159019) | Cod sursa (job #403057) | Cod sursa (job #622240) | Cod sursa (job #2570499)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, i, j, exp, lung, d[30][100003], prima_ap[100002], t[100002], a, b, nr, niv[100002];
short log[100002];
vector<int> v[100002];
void dfs(int nod, int nivel){
d[0][++nr] = nod;
prima_ap[nod] = nr;
niv[nod] = nivel;
for(int i = 0;i<v[nod].size();i++){
int vecin = v[nod][i];
dfs(vecin, nivel+1);
d[0][++nr] = nod;
}
}
int main(){
fin>>n>>m;
for(i=2;i<=n;i++){
fin>>t[i];
v[t[i]].push_back(i);
}
dfs(1, 1);
log[1] = 0;
for(i=2;i<=nr+2;i++){
log[i] = log[i-1];
if(i == (1<<(log[i]+1)))
log[i]++;
}
for(i=1;i<=log[nr]+1;i++){
lung = (1<<i);
for(j=1;j<=nr;j++){
d[i][j] = d[i-1][j];
if(j+lung/2 <= nr)
d[i][j] = min(d[i][j], d[i-1][j+lung/2]);
}
}
while(m--){
fin>>a>>b;
int p1 = prima_ap[a];
int p2 = prima_ap[b];
lung = p2-p1+1;
exp = log[lung];
fout<<min(d[exp][p1], d[exp][p2-(1<<exp)+1])<<"\n";
}
return 0;
}