Pagini recente » Cod sursa (job #983022) | Cod sursa (job #69523) | Cod sursa (job #2825583) | Cod sursa (job #2692678) | Cod sursa (job #2308065)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector<int> v[100002];
int k,a[200002],l[200002],lg[200002],f[100002],r[200002][20];
void dfs(int nr,int lv)
{
a[++k]=nr;
l[k]=lv;
f[nr]=k;
for(auto it:v[nr])
{
dfs(it,lv+1);
a[++k]=nr;
l[k]=lv;
}
}
int main()
{
int n,m,i,j,nr;
in>>n>>m;
for(i=2;i<=n;i++)
{
in>>nr;
v[nr].push_back(i);
}
dfs(1,0);
for(i=2;i<=k;i++)
lg[i]=lg[i/2]+1,r[i][0]=i;
r[1][0]=1;
for(j=0;j<=lg[k];j++)
for(i=0;i+(1<<j)<=k;i++)
if(l[r[i][j]]>l[r[i+(1<<j)][j]])
r[i][j+1]=r[i+(1<<j)][j];
else
r[i][j+1]=r[i][j];
while(m--)
{
in>>i>>j;
i=f[i];j=f[j];
if(i>j)
swap(i,j);
nr=lg[j-i+1];
if(l[r[i][nr]]>l[r[j-(1<<nr)+1][nr]])
out<<a[r[j-(1<<nr)+1][nr]]<<"\n";
else
out<<a[r[i][nr]]<<"\n";
}
return 0;
}