Pagini recente » Cod sursa (job #3283028) | Cod sursa (job #2604551) | Cod sursa (job #2716613) | Cod sursa (job #1998188) | Cod sursa (job #2134171)
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> arb[Nmax];
int lvl[Nmax];
int rmq[20][Nmax<<1];
int Log2[Nmax<<1];
int poz[Nmax];
int N;
void DFS(int x,int nivel)
{
rmq[0][++N]=x;
poz[x]=N;
lvl[x]=nivel;
for(size_t y = 0 ; y < arb[x].size(); ++y)
{
DFS(arb[x][y],nivel+1);
rmq[0][++N]=x;
lvl[x]=nivel;
}
}
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,0);
for(i=2;i<=N;i++)
Log2[i]=Log2[i>>1]+1;
for(i=1;i<=Log2[N];i++)
for(j=1;j<=N-(1<<(i-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;
}