Pagini recente » Cod sursa (job #639043) | Cod sursa (job #2568132) | Cod sursa (job #1944755) | Cod sursa (job #1727441) | Cod sursa (job #2118643)
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
list <int> arb[Nmax];
int lvl[Nmax];
int rmq[20][Nmax<<1];
int Log2[Nmax<<1];
int poz[Nmax];
int N;
void DFS(int x)
{
rmq[0][++N]=x;
poz[x]=N;
for(list <int> :: iterator it=arb[x].begin();it!=arb[x].end();++it)
{
lvl[*it]=lvl[x]+1;
DFS(*it);
rmq[0][++N]=x;
}
}
int main()
{
int n,m,i,j,x,y,k;
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
arb[x].push_back(i);
}
DFS(1);
for(i=2;i<=N;i++)
Log2[i]=Log2[i>>1]+1;
for(i=1;i<=Log2[N];i++)
for(j=1;j+(1<<(i-1))<=(Nmax<<1);j++)
{
if(lvl[rmq[i-1][j]]>lvl[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];
}
while(m--)
{
f>>x>>y;
x=poz[x];
y=poz[y];
if(y<x) swap(x,y);
k=Log2[y-x+1];
if(lvl[rmq[k][x]]>lvl[rmq[k][y-(1<<k)+1]])
g<<rmq[k][y-(1<<k)+1]<<'\n';
else g<<rmq[k][x]<<'\n';
}
return 0;
}