Pagini recente » Cod sursa (job #1036909) | Cod sursa (job #1621275) | Cod sursa (job #220042) | Cod sursa (job #2860957) | Cod sursa (job #2630216)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,q;
int poz[100005],lv[100005],Log[200005];
bool sel[100005];
vector <int> G[100005],par;
pair<int,int> rmq[25][200005];
void dfs(int x, int level)
{
poz[x]=par.size();
lv[x]=level;
par.push_back(x);
for(auto it : G[x])
{
dfs(it,level+1);
par.push_back(x);
}
}
void construct_rmq()
{
int l=par.size()-1;
for(int i=2;i<=l;i++)
{
Log[i]=1+Log[i/2];
}
for(int i=1;i<=l;i++)
{
rmq[0][i]={lv[par[i]],par[i]};
}
for(int i=1;i<=Log[l];i++)
{
for(int j=1;j<=l;j++)
{
if(rmq[i-1][j].first<rmq[i-1][j+(1<<(i-1))].first)
{
rmq[i][j]=rmq[i-1][j];
}
else
{
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
}
}
}
int query(int x, int y)
{
int k=y-x+1;
k=Log[k];
if(rmq[k][x]<rmq[k][y-(1<<k)+1])
{
return rmq[k][x].second;
}
return rmq[k][y-(1<<k)+1].second;
}
int main()
{
f>>n>>q;
for(int i=2;i<=n;i++)
{
int x;
f>>x;
G[x].push_back(i);
}
par.push_back(0);
dfs(1,1);
construct_rmq();
for(int i=1;i<=q;i++)
{
int x,y;
f>>x>>y;
if(poz[x]>poz[y])
{
swap(x,y);
}
g<<query(poz[x],poz[y])<<'\n';
}
return 0;
}