Pagini recente » Cod sursa (job #736038) | rf_1 | Cod sursa (job #2632366) | Cod sursa (job #578039) | Cod sursa (job #410183)
Cod sursa(job #410183)
#include<stdio.h>
#include<vector>
#include<iostream>
#include<fstream>
using namespace std;
int n,m,nr,f[100002],e[200002],l[200002],rmq[20][400002];
vector<int> v[100002];
void dfs(int nod, int niv)
{
e[++nr]=nod;
l[nr]=niv;
f[nod]=nr;
int i,lim=v[nod].size();
for(i=0;i<lim;i++)
{
dfs(v[nod][i],niv+1);
e[++nr]=nod;
l[nr]=niv;
}
}
void make_rmq()
{
int i,j,lim;
for(i=1;i<=nr;i++)
rmq[0][i]=i;
for(i=1;(1<<i)<nr;i++)
{
lim=nr-(1<<i)+1;
for(j=1;j<=lim;j++)
{
rmq[i][j]=rmq[i-1][j];
if(l[rmq[i-1][j+(1<<i-1)]]<l[rmq[i][j]])
rmq[i][j]=rmq[i-1][j+(1<<i-1)];
}
}
}
int main()
{
/* freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);*/
ifstream in("lca.in");
ofstream out("lca.out");
in>>n>>m;
int i,x,y,sol,log[200002];
for(i=2;i<=n;i++)
{
// scanf("%d",&x);
in>>x;
v[x].push_back(i);
}
dfs(1,0);
make_rmq();
for(i=2;i<=nr;i++)
log[i]=log[i>>1]+1;
for(i=1;i<=m;i++)
{
// scanf("%d%d",&x,&y);
in>>x>>y;
x=f[x];
y=f[y];
if(x>y)
x^=y^=x^=y;
sol=rmq[log[y-x+1]][x];
if(l[sol]>l[rmq[log[y-x+1]][y-(1<<log[y-x+1])+1]])
sol=rmq[log[y-x+1]][y-(1<<log[y-x+1])+1];
// printf("%d\n",e[sol]);
out<<e[sol]<<'\n';
}
return 0;
}