Pagini recente » Cod sursa (job #188115) | Cod sursa (job #757087) | Cod sursa (job #2813381) | Cod sursa (job #2217381) | Cod sursa (job #1651388)
#include <stdio.h>
#include <vector>
#include <algorithm>
#define nmax 100010
using namespace std;
struct date { int x,niv; };
int n,m,x,nr,y;
int pos[nmax],v[2*nmax];
date rmq[18][2*nmax];
bool fr[nmax];
vector <int> g[nmax];
inline date minn(date x,date y)
{
if (x.niv<y.niv) return x; else
return y;
}
void dfs(int x,int niv)
{
nr++; rmq[0][nr].x=x; rmq[0][nr].niv=niv; pos[x]=nr; fr[x]=true;
for (int i=0;i<(int)g[x].size();i++)
if (!fr[g[x][i]]) {
dfs(g[x][i],niv+1);
nr++; rmq[0][nr].x=x; rmq[0][nr].niv=niv;
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
for (int i=1;i<=n-1;i++) {
scanf("%d",&x);
g[x].push_back(i+1);
g[i+1].push_back(x);
}
dfs(1,0);
for (int i=2;i<=nr;i++) v[i]=v[i/2]+1;
for (int i=1;(1<<i)<=nr;i++) {
int aux=1<<(i-1);
for (int j=1;j<=nr-aux;j++)
rmq[i][j]=minn(rmq[i-1][j],rmq[i-1][j+aux]);
}
for (int i=1;i<=m;i++) {
scanf("%d %d",&x,&y); x=pos[x]; y=pos[y];
if (x>y) swap(x,y);
int dif=v[(y-x+1)]; int p=1<<dif;
printf("%d\n",minn(rmq[dif][x],rmq[dif][y-p+1]).x);
}
return 0;
}