Pagini recente » Cod sursa (job #2424701) | Cod sursa (job #879654) | Cod sursa (job #1262585) | Cod sursa (job #94272) | Cod sursa (job #897111)
Cod sursa(job #897111)
#include<cstdio>
#include<vector>
#include<algorithm>
#define INF 100005
using namespace std;
int n,m,d[18][INF],first[INF],lg[INF];
vector<int> v,arb[INF];
void oil(int nod)
{
v.push_back(nod);
if(first[nod]==0)first[nod]=v.size()-1;
for(int i=0;i<arb[nod].size();++i)
{
int nod2=arb[nod][i];
oil(nod2);
v.push_back(nod);
}
}
void rmq()
{
n=v.size();
lg[1]=0;
for(int i=2;i<=n;++i)lg[i]=lg[i/2]+1;
for(int i=0;i<v.size();++i)d[0][i]=v[i];
for(int i=1;i<=lg[n];++i)
for(int j=0;j<n-(1<<i);++j)
d[i][j]=min(d[i-1][j],d[i-1][j+(1<<(i-1))]);
}
int querry(int a,int b)
{
a=first[a];
b=first[b];
int k=lg[b-a+1];
return min(d[k][a],d[k][b-(1<<k)+1]);
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<n;++i)
{
int x;
scanf("%d",&x);
arb[x].push_back(i+1);
}
oil(1);
rmq();
for(int i=0;i<m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",querry(a,b));
}
return 0;
}