#define PROBLEM "https://judge.yosupo.jp/problem/lca"
#include"../template.h"
#include"Tree/Lca.h"voidsolve(){intn,q;cin>>n>>q;Lcalca(n);for(inti=1;i<=n-1;i++){intx;cin>>x;lca.tree[i].emplace_back(x);lca.tree[x].emplace_back(i);}lca.dfs(0,-1);while(q--){intu,v;cin>>u>>v;cout<<lca.query(u,v)<<'\n';}}
#line 1 "Tree/Lowest_common_ancestor.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/lca"
#line 2 "template.h"
#include<bits/stdc++.h>usingnamespacestd;#define ll long long
#define MOD (ll)(1e9+7)
#define all(x) (x).begin(),(x).end()
#define unique(x) x.erase(unique(all(x)), x.end())
#define INF32 ((1ull<<31)-1)
#define INF64 ((1ull<<63)-1)
#define inf (ll)1e18
#define vi vector<int>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
constintmod=998244353;voidsolve();intmain(){ios_base::sync_with_stdio(false);cin.tie(NULL);// cin.exceptions(cin.failbit);// int t; cin >> t;// while(t--)solve();cerr<<"\nTime run: "<<1000*clock()/CLOCKS_PER_SEC<<"ms"<<'\n';return0;}#line 2 "Tree/Tree/Lca.h"
structLca{vector<vector<int>>tree,up;vector<int>h;Lca(){}Lca(intn):tree(n+1),up(n+1,vector<int>(20)),h(n+1,0){}voiddfs(intu,intp){for(intv:tree[u]){if(v==p)continue;up[v][0]=u;h[v]=h[u]+1;for(intj=1;j<20;j++){up[v][j]=up[up[v][j-1]][j-1];}dfs(v,u);}}voidaddEdge(intu,intv){tree[u].emplace_back(v);tree[v].emplace_back(u);}intquery(intu,intv){if(h[u]<h[v])swap(u,v);intk=h[u]-h[v];u=ancestor_k(u,k);if(u==v)returnu;k=__lg(h[u]);for(intj=k;j>=0;j--){if(up[u][j]!=up[v][j]){u=up[u][j];v=up[v][j];}}returnup[u][0];}intdist(intu,intv){intnode=query(u,v);returnh[u]+h[v]-2*h[node];}intancestor_k(intu,intk){for(intj=0;(1<<j)<=k;j++){if(k>>j&1)u=up[u][j];}returnu;}};#line 5 "Tree/Lowest_common_ancestor.test.cpp"
voidsolve(){intn,q;cin>>n>>q;Lcalca(n);for(inti=1;i<=n-1;i++){intx;cin>>x;lca.tree[i].emplace_back(x);lca.tree[x].emplace_back(i);}lca.dfs(0,-1);while(q--){intu,v;cin>>u>>v;cout<<lca.query(u,v)<<'\n';}}