Pagini recente » Cod sursa (job #2861833) | Cod sursa (job #2175691) | Cod sursa (job #351865) | Monitorul de evaluare | Cod sursa (job #1362523)
#include <stdio.h>
#include <vector>
#include <cmath>
std::vector<int> adj[100001];
int pos,ap[100001],ni[100001],niv[500001],fin[500001],n;
int rmq[500001][20];
int p[20];
void dfs(int nod)
{
fin[pos]=nod;
ap[nod] = pos;
pos++;
std::vector<int>::iterator it;
for(it=adj[nod].begin();it!=adj[nod].end();++it)
{
dfs(*it);
fin[pos]=nod;
pos++;
}
}
int minim(int a,int b)
{
if(a>b)return b;
return a;
}
int main()
{
freopen ("lca.in","r",stdin);
freopen ("lca.out","w",stdout);
int m;
scanf("%d%d",&n,&m);
int nr;
niv[1]=1;
for(int i=2;i<=n;i++)
{
scanf("%d",&nr);
adj[nr].push_back(i);
ni[i]=ni[nr]+1;
}
pos=1;
dfs(1);
for(int i = 1; i <=pos; ++i) niv[i]=ni[fin[i]];
//for(int i=1;i<=pos;i++) printf("%d ",niv[i]);
//printf("\n");
pos--;
for(int i=1;i<=pos;i++) rmq[i][0]=i;
for(int j=1;(1<<j)<=pos;j++)
{
for(int i=1;i+(1<<j)-1<=pos;i++)
{
if(niv[rmq[i][j-1]]<niv[rmq[i+(1<<(j-1))][j-1]]) rmq[i][j]=rmq[i][j-1];
else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}
}
int x,y;
int temp;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
x=ap[x];
y=ap[y];
if(x>y)
{
temp=x;
x=y;
y=temp;
}
int k=log2(y-x+1);
if(niv[rmq[x][k]]<niv[rmq[y-(1<<k)+1][k]]) printf("%d\n",fin[rmq[x][k]]);
else printf("%d\n",fin[rmq[y-(1<<k)+1][k]]);
}
}