Pagini recente » Cod sursa (job #531417) | Cod sursa (job #1677084) | Cod sursa (job #2606962) | Cod sursa (job #2608022) | Cod sursa (job #3280811)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m;
vector <int> v[100005];
int d[200005][25],eulr[200005],nivl[200005],cnt,t[100005],nr1,nr2;
bool f[100005];
void dfs(int s)
{
f[s]=1;
//eulr[++cnt]=s;
for(auto it : v[s])
{
if(!f[it])
{
eulr[++cnt]=s;
f[it]=1;
dfs(it);
}
//eulr[++cnt]=s;
}
//if(ok)
eulr[++cnt]=s;
}
int main()
{
in>>n>>m;
for(int i=2;i<=n;i++)
{ int x;
in>>x;
nivl[i]=nivl[x]+1;
v[i].push_back(x);
v[x].push_back(i);
}
for(int i=1;i<=n;i++)
sort(v[i].begin(),v[i].end());
dfs(1);
/*for(int i=1;i<=cnt;i++)
cout<<eulr[i]<<' ';
cout<<'\n';
for(int i=1;i<=cnt;i++)
cout<<nivl[eulr[i]]<<' ';
*/
for(int i=1;i<=cnt;i++)
d[i][0]=eulr[i];
for(int j=1;(1<<j)<=cnt;j++)
for(int i=1;(i+(1<<(j))-1)<=cnt;i++)
//d[i][j]=min(nivl[d[i][j-1]],nivl[d[i+(1<<(j-1))][j-1]]);
if(nivl[d[i][j-1]]>nivl[d[i+(1<<(j-1))][j-1]])
d[i][j]=d[i+(1<<(j-1))][j-1];
else d[i][j]=d[i][j-1];
for(int i=1;i<=m;i++)
{
in>>nr1>>nr2;
int ok1=0,ok2=0;
int x,y;
for(int i=1;i<=cnt;i++)
{
if(nr1==eulr[i] && !ok1) ok1=1,x=i;
if(nr2==eulr[i] && !ok2) ok2=1,y=i;
}
if(x>y) swap(x,y);
int p=log2(y-x+1);
//out<<min(d[x][p],d[y-(1<<p)+1][p])<<'\n';
if(nivl[d[x][p]]>nivl[d[y-(1<<p)+1][p]])
out<<d[y-(1<<p)+1][p]<<'\n';
else out<<d[x][p]<<'\n';
}
return 0;
}