Pagini recente » Cod sursa (job #1092366) | Cod sursa (job #1924551) | Cod sursa (job #2604120) | Cod sursa (job #538921) | Cod sursa (job #1903838)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int n,m,to;
int app[100010],nivel[200010],p;
int lg[200010];
int rmq[19][200010];
vector<int> adj[100010];
void fill_euler(int nod,int lvl)
{
p++;
app[nod]=p;
rmq[0][p]=nod;
rmq[0][0]++;
nivel[nod]=lvl;
for(vector<int>::iterator it=adj[nod].begin();it!=adj[nod].end();it++)
{
fill_euler(*it,lvl+1);
p++;
rmq[0][p]=nod;
rmq[0][0]++;
}
}
void build_rmq()
{
int temp=n;
while(temp!=0)
{
to++;
temp>>=1;
}
for(int i=1;i<=to;i++)
{
for(int j=1;;j++)
{
if(j+(1<<(i-1))>rmq[i-1][0])
{
rmq[i][0]=j-1;
break;
}
if(nivel[rmq[i-1][j]]>nivel[rmq[i-1][j+(1<<(i-1))]])
{
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
else
{
rmq[i][j]=rmq[i-1][j];
}
}
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
int x,y;
for(int i=2;i<=n;i++)
{
scanf("%d",&x);
adj[x].push_back(i);
}
fill_euler(1,1);
build_rmq();
/*for(int i=0;i<=to;i++)
{
printf("%d: ",i);
for(int j=1;j<=rmq[i][0];j++)
{
printf("%d ",rmq[i][j]);
}
printf("\n");
}*/
lg[1]=0;
for(int i=2;i<=200000;i++)
{
lg[i]=lg[i>>1]+1;
}
int dist,res;
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
if(app[x]<app[y])
{
swap(x,y);
}
dist=app[x]-app[y]+1;
if(nivel[rmq[lg[dist]][app[y]]]>nivel[rmq[lg[dist]][app[x]-(1<<lg[dist])+1]])
{
res=rmq[lg[dist]][app[x]-(1<<lg[dist])+1];
}
else
{
res=rmq[lg[dist]][app[y]];
}
printf("%d\n",res);
}
}