Pagini recente » Cod sursa (job #818757) | Cod sursa (job #881452) | Cod sursa (job #1944957) | Cod sursa (job #1208274) | Cod sursa (job #767520)
Cod sursa(job #767520)
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 100001
vector<int> g[MAX];
int n,a[2*MAX],h[2*MAX],nr,pos[MAX],c[2*MAX][18];
bool was[MAX];
void dfs(int x,int k){
a[nr] = x;
h[nr] = k;
nr++;
for(int i=0;i<g[x].size();i++)
{
dfs(g[x][i],k+1);
a[nr] = x;
h[nr] = k;
nr++;
}
}
void rmq(){
for(int i=0;i<nr;i++) c[i][0] = i;
for(int j=1;(1<<j)<=nr;j++)
for(int i=0;i+(1<<j)<=nr;i++)
if( h[ c[i][j-1] ] < h[ c[i+(1<<(j-1))][j-1] ] ) c[i][j] = c[i][j-1]; else
c[i][j] = c[i+(1<<(j-1))][j-1];
/* for(int i=0;i<=20;i++)
{
for(int j=0;j<=5;j++)printf("%d ",a[ c[i][j] ]); printf("\n"); } */
}
int main(){
int m,x,y,k;
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=2;i<=n;i++)
{
scanf("%d ",&x);
g[x].push_back(i);
}
dfs(1,0);
rmq();
for(int i=0;i<nr;i++)
if( !was[ a[i] ] )
{
pos[ a[i] ] = i;
was[ a[i] ] = 1;
}
// for(int i=0;i<nr;i++)printf("%d ",a[i]); printf("\n");
// for(int i=0;i<nr;i++)printf("%d ",h[i]); printf("\n");
// for(int i=1;i<=n;i++)printf("%d ",pos[i]); printf("\n");
while(m--)
{
scanf("%d %d",&x,&y);
x = pos[x];
y = pos[y];
k = log(y-x+1)/log(2);
if( h[ c[x][k] ] < h[ c[y-(1<<k)+1][k] ]) printf("%d\n",a[ c[x][k] ]); else printf("%d\n",a[ c[y-(1<<k)+1][k] ]);
}
return 0;
}