Pagini recente » Cod sursa (job #2478552) | Cod sursa (job #2928697) | Cod sursa (job #2334410) | Cod sursa (job #2490197) | Cod sursa (job #2807355)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> g[100005];
int n,i,j,x,y,cnt,l2[200005],h[100005],eu[200005],q,lev[200005],rmq[200005][20];
bool vis[100005];
void euler(int nod, int l)
{
eu[++cnt]=nod;
lev[cnt]=l;
if(!h[nod])h[nod]=cnt;
for(auto x:g[nod])
{
euler(x,l+1);
eu[++cnt]=nod;
}
}
void build()
{
for(i=1;i<n*2;i++)
rmq[i][0]=eu[i];
int p=1;
for(j=1;(1<<j)<=2*n;j++)
{
p<<=1;
for(i=1;i+p-1<=2*n;i++)
rmq[i][j]=min(rmq[i][j-1],rmq[i+p/2][j-1]);
}
}
int qr(int x, int y)
{
int l=l2[y-x+1];
return min(rmq[x][l],rmq[y-(1<<l)+1][l]);
}
int main()
{
fin>>n>>q;
for(i=2;i<=n;i++)
{
fin>>x;
g[x].push_back(i);
}
for(i=2;i<=n*2;i++)
l2[i]=l2[i>>1]+1;
euler(1,1);
build();
while(q--)
{
fin>>x>>y;
if(h[x]>h[y])swap(x,y);
fout<<qr(h[x],h[y])<<'\n';
}
return 0;
}