Pagini recente » Cod sursa (job #2331193) | Cod sursa (job #2314806) | Cod sursa (job #2865959) | Cod sursa (job #2208778) | Cod sursa (job #3254212)
#include <bits/stdc++.h>//DaryuF
#define ll long long
#define pb push_back
#define fi first
#define se second
#define pii pair <int,int>
#define MOD 777013
#define e exit(0)
using namespace std;
const string file = "lca";
ifstream in(file + ".in");
ofstream out(file + ".out");
#define cin in
#define cout out
const int NMAX = 100001;
int n, q, rmq[2*NMAX][17], lg2[2*NMAX], t[NMAX],euler[2*NMAX],niv[2*NMAX],poz[NMAX],m,v[NMAX];
vector <int>gf[NMAX];
void dfs(int nod)
{
euler[++m] = nod;
niv[m] = nod;
poz[nod] = m;
for(auto i:gf[nod])
{
dfs(i);
euler[++m] = nod;
niv[m] = nod;
}
}
void build_rmq()
{
for(int i=2;i<=m;i++)
lg2[i] = lg2[i>>1] + 1;
for(int i=1;i<=m;i++)
rmq[i][0] = i;
for(int j=1;(1<<j)<=m;j++)
for(int i=1;i+(1<<j)-1<=m;i++)
{
rmq[i][j] = min(niv[rmq[i][j-1]],niv[rmq[i+(1<<j-1)][j-1]]);
}
}
int lca(int x,int y)
{
x = poz[x], y = poz[y];
int l = lg2[y-x+1];
int a = rmq[x][l], b = rmq[y-(1<<l)+1][l];
if(niv[a]> niv[b])
return euler[b];
else return euler[a];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for(int i=2;i<=n;i++)
{
int x;
cin >> x;
gf[x].pb(i);
}
dfs(1);
build_rmq();
while(q--)
{
int x, y;
cin >> x >> y;
cout << lca(x,y) << '\n';
}
return 0;
}