Pagini recente » Cod sursa (job #1338566) | Cod sursa (job #815093) | Cod sursa (job #2681878) | Cod sursa (job #949970) | Cod sursa (job #1804579)
#include<iostream>
#include<fstream>
#include<vector>
#define DX 100010
using namespace std;
fstream fin("lca.in",ios::in),fout("lca.out",ios::out);
vector<int> v[DX];
int n,q,la,a[2*DX],bst[2*DX][19],first[2*DX],rad[2*DX];
void citire()
{
int i,a;
fin>>n>>q;
for(i=2;i<=n;i++)
{
fin>>a;
v[a].push_back(i);
}
}
void dfs(int nod)
{
la++;
a[la]=nod;
first[nod]=la;
for(int i=0;i<v[nod].size();i++)
{
dfs(v[nod][i]);
la++;
a[la]=nod;
}
}
void rmq()
{
int i,j;
for(j=1;(1<<j)<=la;j++) rad[(1<<j)]=j;
for(i=1;i<=la;i++)
{
rad[i]=max(rad[i],rad[i-1]);
bst[i][0]=a[i];
}
for(j=1;(1<<j)<=la;j++) for(i=1;i+(1<<j)<=la;i++) bst[i][j]=min(bst[i][j-1],bst[i+(1<<(j-1))][j-1]);
}
int query(int a,int b)
{
//cout<<a<<" "<<b<<"\n";
int l=b-a+1,r=rad[l];
//cout<<a<<" "<<r<<" "<<bst[a][r]<<" "<<b-(1<<r)+1<<" "<<r<<" "<<bst[b-(1<<r)+1][r]<<"\n";
return min(bst[a][r],bst[b-(1<<r)+1][r]);
}
int main()
{
int i,a,b;
citire();
dfs(1);
rmq();
for(i=1;i<=q;i++)
{
fin>>a>>b;
fout<<query(min(first[a],first[b]),max(first[a],first[b]))<<"\n";
}
}