#include<bits/stdc++.h>
using namespace std;
const int mx=2e5+5;
int n, q;
vector<int> adj[mx];
int up[mx][20], dep[mx];
// DFS một lần để tính độ sâu và xây bảng up
void dfs(int u, int p) {
dep[u] = dep[p] + 1;
up[u][0] = p;
// Tự tính tổ tiên ngay trong lúc DFS
for(int i=1; i<20; ++i)
up[u][i] = up[up[u][i-1]][i-1];
for(int v : adj[u]) {
if(v != p) dfs(v, u);
}
}
int lca(int u, int v) {
// Đảm bảo u luôn sâu hơn v để dễ xử lý
if(dep[u] < dep[v]) swap(u, v);
// Bước 1: Kéo u lên cho bằng độ sâu v
// Duyệt từ bước nhảy to nhất về nhỏ nhất
for(int i=19; i>=0; --i) {
if(dep[u] - (1<<i) >= dep[v])
u = up[u][i];
}
if(u == v) return u;
// Bước 2: Kéo cả 2 lên cùng lúc
// Chỉ nhảy khi sếp KHÁC nhau (nghĩa là chưa chạm phần chung)
for(int i=19; i>=0; --i) {
if(up[u][i] != up[v][i]) {
u = up[u][i];
v = up[v][i];
}
}
// Lúc này u và v đang ở ngay dưới LCA -> Trả về bố của u
return up[u][0];
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
if(fopen("Company_Queries_II.inp","r"))
{
freopen("Company_Queries_II.inp","r",stdin);
freopen("Company_Queries_II.out","w",stdout);
}
cin >> n >> q;
for(int i=2; i<=n; ++i) {
int boss; cin >> boss;
adj[boss].push_back(i);
}
// Gốc là 1, cha của gốc coi như là 0
dfs(1, 0);
while(q--) {
int a, b;
cin >> a >> b;
cout << lca(a, b) << '\n';
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IG14PTJlNSs1OwppbnQgbiwgcTsKdmVjdG9yPGludD4gYWRqW214XTsKaW50IHVwW214XVsyMF0sIGRlcFtteF07IAoKLy8gREZTIG3hu5l0IGzhuqduIMSR4buDIHTDrW5oIMSR4buZIHPDonUgdsOgIHjDonkgYuG6o25nIHVwCnZvaWQgZGZzKGludCB1LCBpbnQgcCkgewogICAgZGVwW3VdID0gZGVwW3BdICsgMTsKICAgIHVwW3VdWzBdID0gcDsKICAgIAogICAgLy8gVOG7sSB0w61uaCB04buVIHRpw6puIG5nYXkgdHJvbmcgbMO6YyBERlMKICAgIGZvcihpbnQgaT0xOyBpPDIwOyArK2kpCiAgICAgICAgdXBbdV1baV0gPSB1cFt1cFt1XVtpLTFdXVtpLTFdOwogICAgICAgIAogICAgZm9yKGludCB2IDogYWRqW3VdKSB7CiAgICAgICAgaWYodiAhPSBwKSBkZnModiwgdSk7CiAgICB9Cn0KCmludCBsY2EoaW50IHUsIGludCB2KSB7CiAgICAvLyDEkOG6o20gYuG6o28gdSBsdcO0biBzw6J1IGjGoW4gdiDEkeG7gyBk4buFIHjhu60gbMO9CiAgICBpZihkZXBbdV0gPCBkZXBbdl0pIHN3YXAodSwgdik7CiAgICAKICAgIC8vIELGsOG7m2MgMTogS8OpbyB1IGzDqm4gY2hvIGLhurFuZyDEkeG7mSBzw6J1IHYKICAgIC8vIER1eeG7h3QgdOG7qyBixrDhu5tjIG5o4bqjeSB0byBuaOG6pXQgduG7gSBuaOG7jyBuaOG6pXQKICAgIGZvcihpbnQgaT0xOTsgaT49MDsgLS1pKSB7CiAgICAgICAgaWYoZGVwW3VdIC0gKDE8PGkpID49IGRlcFt2XSkgCiAgICAgICAgICAgIHUgPSB1cFt1XVtpXTsKICAgIH0KICAgIAogICAgaWYodSA9PSB2KSByZXR1cm4gdTsKICAgIAogICAgLy8gQsaw4bubYyAyOiBLw6lvIGPhuqMgMiBsw6puIGPDuW5nIGzDumMKICAgIC8vIENo4buJIG5o4bqjeSBraGkgc+G6v3AgS0jDgUMgbmhhdSAobmdoxKlhIGzDoCBjaMawYSBjaOG6oW0gcGjhuqduIGNodW5nKQogICAgZm9yKGludCBpPTE5OyBpPj0wOyAtLWkpIHsKICAgICAgICBpZih1cFt1XVtpXSAhPSB1cFt2XVtpXSkgewogICAgICAgICAgICB1ID0gdXBbdV1baV07CiAgICAgICAgICAgIHYgPSB1cFt2XVtpXTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vIEzDumMgbsOgeSB1IHbDoCB2IMSRYW5nIOG7nyBuZ2F5IGTGsOG7m2kgTENBIC0+IFRy4bqjIHbhu4EgYuG7kSBj4bunYSB1CiAgICByZXR1cm4gdXBbdV1bMF07Cn0KCmludCBtYWluKCkKewogICAgY2luLnRpZSgwKS0+c3luY193aXRoX3N0ZGlvKDApOwogICAgaWYoZm9wZW4oIkNvbXBhbnlfUXVlcmllc19JSS5pbnAiLCJyIikpCiAgICB7CiAgICAgICAgZnJlb3BlbigiQ29tcGFueV9RdWVyaWVzX0lJLmlucCIsInIiLHN0ZGluKTsKICAgICAgICBmcmVvcGVuKCJDb21wYW55X1F1ZXJpZXNfSUkub3V0IiwidyIsc3Rkb3V0KTsKICAgIH0KICAgIAogICAgY2luID4+IG4gPj4gcTsKICAgIGZvcihpbnQgaT0yOyBpPD1uOyArK2kpIHsKICAgICAgICBpbnQgYm9zczsgY2luID4+IGJvc3M7CiAgICAgICAgYWRqW2Jvc3NdLnB1c2hfYmFjayhpKTsKICAgIH0KICAgIAogICAgLy8gR+G7kWMgbMOgIDEsIGNoYSBj4bunYSBn4buRYyBjb2kgbmjGsCBsw6AgMAogICAgZGZzKDEsIDApOwoKICAgIHdoaWxlKHEtLSkgewogICAgICAgIGludCBhLCBiOwogICAgICAgIGNpbiA+PiBhID4+IGI7CiAgICAgICAgY291dCA8PCBsY2EoYSwgYikgPDwgJ1xuJzsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==