Pagini recente » Cod sursa (job #496136) | Cod sursa (job #2185646) | Cod sursa (job #2718433) | Cod sursa (job #3251362) | Cod sursa (job #2479665)
#include <fstream>
#include <vector>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define csp first
#define sz second
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,m,i,a,b,r[200005][22];
vector<pair<int,int> >v;
struct adat
{
int os,s,e;
vector<int>lesz;
bool l;
};
vector<adat>x;
void melysegi(int i, int szint)
{
x[i].s=szint;
v.push_back({i,szint});
x[i].e=v.size()-1;
x[i].l=true;
for(auto e : x[i].lesz)
if(x[e].l==false)
{
melysegi(e,szint+1);
v.push_back({i,szint});
}
}
void elkeszit()
{
int n=v.size(),j;
int l;
for(i=0;i<n;++i) r[i][0]=i;
for(j=1;(1<<j)<=n;++j)
for(i=0;i<n;++i)
{
l=min(n-1,i+(1<<(j-1)));
if(v[r[i][j-1]].sz<v[r[l][j-1]].sz)
r[i][j]=r[i][j-1];
else r[i][j]=r[l][j-1];
}
}
int rmq(int a, int b)
{
int k,l,m;
k=log2(b-a+1);
l=min(b,a+(1<<k)+1);
m=log2(abs(l-b)+1);
if(v[r[a][k]].sz<=v[r[l][m]].sz)
return r[a][k];
else return r[l][m];
}
int main()
{
cin>>n>>m;
x.resize(n+1);
for(i=2;i<=n;++i)
{
cin>>x[i].os;
x[x[i].os].lesz.push_back(i);
}
melysegi(1,0);
/*for(auto e : v) cout<<e.csp<<" ";
cout<<"\n";
for(auto e : v) cout<<e.sz<<" ";
cout<<"\n";*/
elkeszit();
for(i=1;i<=m;++i)
{
cin>>a>>b;
if(x[a].e<x[b].e) cout<<v[rmq(x[a].e,x[b].e)].csp<<"\n";
else cout<<v[rmq(x[b].e,x[a].e)].csp<<"\n";
}
return 0;
}