Pagini recente » Cod sursa (job #2324330) | Cod sursa (job #2192672) | Cod sursa (job #688192) | Cod sursa (job #1877026) | Cod sursa (job #2720039)
#include <bits/stdc++.h>
#define N 100001
#define pb push_back
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> v[N], eul;
int n, q, i, x, rmq[18][2*N], pmin[18][2*N], lvl[N], lg[2*N], p[N], y;
void euler(int nod)
{
eul.pb(nod);
for(auto i:v[nod])
{
int ok=1;
lvl[i]=lvl[nod]+1;
euler(i);
eul.pb(nod);
}
}
void do_rmq()
{
int i, j;
for(i=2;i<=n;++i)
lg[i]=lg[i/2]+1;
for(i=1;i<=lg[n];++i)
for(j=0;j<n-(1<<i)+1;++j)
{
if(rmq[i-1][j]<rmq[i-1][j+(1<<(i-1))])
{
rmq[i][j]=rmq[i-1][j];
pmin[i][j]=pmin[i-1][j];
}
else
{
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
pmin[i][j]=pmin[i-1][j+(1<<(i-1))];
}
// rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
}
int main()
{
fin>>n>>q;
for(i=2;i<=n;++i)
{
fin>>x;
v[x].pb(i);
}
euler(1);
for(i=0;i<eul.size();++i)
{
if(p[eul[i]]==0)
p[eul[i]]=i;
rmq[0][i]=lvl[eul[i]];
pmin[0][i]=eul[i];
}
n=eul.size();
do_rmq();
while(q--)
{
fin>>x>>y;
int l=p[x], r=p[y];
if(l>r)
swap(l,r);
int lgg=lg[r-l];
if(rmq[lgg][l]<rmq[lgg][r-(1<<(lgg))+1])
fout<<pmin[lgg][l]<<'\n';
else fout<<pmin[lgg][r-(1<<(lgg))+1]<<'\n';
}
return 0;
}