Pagini recente » Cod sursa (job #1864204) | Cod sursa (job #1056280) | Cod sursa (job #2324284) | Cod sursa (job #692703) | Cod sursa (job #2124492)
#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))<=N;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;
}