Pagini recente » Cod sursa (job #174736) | Cod sursa (job #237725) | Cod sursa (job #719896) | Cod sursa (job #1102866) | Cod sursa (job #1777979)
#include <bits/stdc++.h>
using namespace std;
vector<int> a[100005];
int b[400005],h[100005],sb=0;
int rmq[25][400005];
int n,m,x,y;
void Make(int nod){
b[++sb]=nod;
if(!h[nod]) h[nod]=sb;
for(int i=0;i<a[nod].size();i++){
Make(a[nod][i]);
b[++sb]=nod;
}
}
void BuildRMQ(){
for(int i=1;i<=sb;i++) rmq[0][i]=b[i];
for(int i=1;(1<<i)<=sb;i++){
for(int j=1;j<=sb-(1<<i)+1;j++){
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
}
}
int RMQ(int l, int r){
int k = (int)log2(r-l+1);
return min(rmq[k][l],rmq[k][r-(1<<k)+1]);
}
int main()
{
ifstream in("lca.in");
ofstream out("lca.out");
in >> n >> m;
for(int i=2;i<=n;i++){
in >> x;
a[x].push_back(i);
}
Make(1);
//for(int i=1;i<=sb;i++) cout << b[i] << ' ';
BuildRMQ();
for(int i=1;i<=m;i++){
in >> x >> y;
if(h[x]<h[y]) out << RMQ(h[x],h[y]) << '\n';
else out << RMQ(h[y],h[x]) << '\n';
}
}