Pagini recente » Cod sursa (job #2469945) | Cod sursa (job #1223195) | Cod sursa (job #2354487) | Cod sursa (job #1213176) | Cod sursa (job #2786587)
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define ll long long
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m,i,j,k,l,e[20][300003],f[100001],g[100001],x;
struct t{int x,p;}a[100000];
void v(int p)
{
g[a[p].x]=l,e[0][l++]=a[p].x;
while(a[p].x==a[f[a[p].x]].p)v(f[a[p].x]++),e[0][l++]=a[p].x;
}
int main()
{
a[0].x=1;
in>>n>>m;
for(i=1;i<n;i++)
in>>a[i].p,a[i].x=i+1;
sort(a,a+n,[](t a,t b){return a.p<b.p;});
for(i=0;i<n;i++)if(f[a[i].p]==0)f[a[i].p]=i;
//for(i=0;i<n;i++)cout<<a[i].p<<' '<<a[i].x<<'\n';
//for(i=1;i<=n;i++)cout<<f[i]<<' ';cout<<'\n';
v(0);
//for(i=0;i<l;i++)cout<<e[0][i]<<' ';
for(k=1;k<20;k++)
{
j=1<<(k-1),i=l;
while(--i+j>=l)e[k][i]=e[k-1][i];
while(i>=0)e[k][i]=bmin(e[k-1][i],e[k-1][i+j]),i--;
}
//for(i=0;i<5;i++){for(j=0;j<l;j++)cout<<e[i][j]<<' ';cout<<'\n';}
while(m--)
{
in>>i>>j;
i=g[i],j=g[j];
if(i>j)sw(i,j);
j++,k=19,x=INT_MAX;
while(j>i)
{
if(j-i>=1<<k)x=bmin(x,e[k][i]),i+=1<<k;
k--;
}
out<<x<<'\n';
}
}