Pagini recente » Cod sursa (job #742134) | Cod sursa (job #95824) | Cod sursa (job #2196123) | Cod sursa (job #1382395) | Cod sursa (job #2289198)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct Euler
{
int nod,lvl;
} parc[400005];
vector<int> g[100005];
bool viz[100005];
int rmq[100005][20];
int k;
int logx[100005];
int ap[100005];
void dfs(int nod, int lvl)
{
parc[++k].nod=nod;
parc[k].lvl=lvl;
for(int i=0; i<g[nod].size(); i++)
if(viz[g[nod][i]]==0){
viz[g[nod][i]]=1;
dfs(g[nod][i], lvl+1);
parc[++k].nod=nod;
parc[k].lvl=lvl;
}
}
int main()
{ freopen("lca.in", "r",stdin);
freopen("lca.out", "w",stdout);
int n,m,i,x,j,y,l,sol;
scanf("%d%d", &n, &m);
for(i=2; i<=n; i++){
scanf("%d", &x);
g[x].push_back(i);
}
dfs(1, 0);
for(i=1; i<=k; i++){
if(ap[parc[i].nod]==0)
ap[parc[i].nod]=i;
rmq[i][0]=i;
for(j=1; (1<<j)<=i; j++){
if(parc[rmq[i][j-1]].lvl<parc[rmq[i-(1<<(j-1))][j-1]].lvl)
rmq[i][j]=rmq[i][j-1];
else
rmq[i][j]=rmq[i-(1<<(j-1))][j-1];
}
}
logx[1]=0;
for(i=2; i<=n; i++)
logx[i]=1+logx[i/2];
for(i=1; i<=m; i++){
scanf("%d%d", &x, &y);
x=ap[x];
y=ap[y];
l=logx[abs(y-x)+1];
if(parc[rmq[max(x,y)][l]].lvl<parc[rmq[min(x,y)+(1<<l)-1][l]].lvl)
sol=rmq[max(x,y)][l];
else
sol=rmq[min(x,y)+(1<<l)-1][l];
printf("%d\n", parc[sol].nod);
}
return 0;
}