Pagini recente » Cod sursa (job #1423597) | Cod sursa (job #2314102) | Cod sursa (job #403131) | Cod sursa (job #54636) | Cod sursa (job #3226559)
#include <bits/stdc++.h>
#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
///#include <tryhardmode>
///#include <GODMODE::ON>
using namespace std;
#define cin fin
#define cout fout
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int NMAX=1e5+5;
vector<int>v[NMAX];
int rmq[25][2*NMAX];
int lg[2*NMAX];
int lvl[2*NMAX];
int ti[NMAX];
int kon;
void dfs(int p,int tata)
{
lvl[p]=lvl[tata]+1;
ti[p]=++kon;
rmq[0][kon]=p;
for(auto i:v[p])
{
if(i!=tata)
{
dfs(i,p);
rmq[0][++kon]=p;
}
}
}
bool cmp(int x,int y)
{
return lvl[x]<lvl[y];
}
int query(int x,int y)
{
int interv=y-x+1;
int l=lg[interv];
return min(rmq[l][x],rmq[l][x+interv-(1<<l)],cmp);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n,q,i,j,e;
cin>>n>>q;
for(i=2;i<=n;i++)
{
int x;
cin>>x;
v[i].push_back(x);
v[x].push_back(i);
}
dfs(1,0);
lg[1]=0;
for(i=2;i<=kon;i++)
lg[i]=lg[i/2]+1;
for(e=1;(1<<e)<=kon;e++)
{
for(i=1;i<=kon;i++)
{
if(i+(1<<(e-1))>kon)
continue;
rmq[e][i]=min(rmq[e-1][i],rmq[e-1][i+(1<<(e-1))],cmp);
}
}
while(q--)
{
int x,y;
cin>>x>>y;
x=ti[x];
y=ti[y];
if(x>y)
swap(x,y);
cout<<query(x,y)<<"\n";
}
return 0;
}