Pagini recente » Cod sursa (job #1682062) | Cod sursa (job #1473311) | Cod sursa (job #745604) | Cod sursa (job #2560958) | Cod sursa (job #764275)
Cod sursa(job #764275)
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAX 100001
vector<int>g[MAX];
int n,niv[2*MAX],nod[2*MAX],pos[2*MAX],nr;
int r[2*MAX][20];
bool was[2*MAX];
void dfs(int x,int k){
nod[nr] = x;
niv[nr] = k;
nr++;
for(int i=0;i<g[x].size();i++)
{
dfs(g[x][i],k+1);
nod[nr] = x;
niv[nr] = k;
nr++;
}
}
void rmq(){
for(int i=0;i<nr;i++)r[i][0]=i;
for(int j=1;(1<<j)<=nr;j++)
for(int i=0;i+(1<<j)<=nr;i++)
{
if(niv[ r[i][j-1] ] < niv[ r[i+(1<<(j-1))][j-1] ])r[i][j] = r[i][j-1]; else
r[i][j] = r[i+(1<<(j-1))][j-1];
}
/*for(int i=0;i<nr;i++){
for(int j=0;j<=10;j++)printf("%d ",r[i][j]); printf("\n"); } */
}
int main(){
int m,x,y;
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); //tata nodului i este x
}
dfs(1,0);
/* for(int i=0;i<nr;i++)printf("%d ",nod[i]);
printf("\n");
for(int i=0;i<nr;i++)printf("%d ",niv[i]); printf("\n"); */
rmq();
for(int i=0;i<nr;i++)
if( !was[ nod[i] ] )
{
pos[ nod[i] ] = i;
was[ nod[i] ] = 1;
}
// for(int i=1;i<=n;i++)printf("%d ",pos[i]);
while(m--)
{
scanf("%d %d",&x,&y);
x = pos[x];
y = pos[y]; if(x > y) swap(x,y);
int k = log(y-x+1)/log(2);
// printf("%d %d %d ",x,y,k);
printf("%d\n",min( nod[ r[x][k] ],nod[ r[y-(1<<k)+1][k] ]));
}
return 0;
}