Pagini recente » Cod sursa (job #1359385) | Cod sursa (job #1992441) | Cod sursa (job #669970) | Cod sursa (job #1037909) | Cod sursa (job #2098152)
#include <bits/stdc++.h>
#define N 100100
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
struct lol{
int mn, lca;
};
int n, m, x, y, vf, stk[2 * N], poz[N], d[N];
vector <int> v[N];
lol rmq[19][2 * N];
bool viz[N];
void dfs(int from, int lvl){
viz[from] = 1;
d[from] = lvl;
stk[++vf] = from;
poz[from] = vf;
for(auto to : v[from])
if(!viz[to]){
dfs(to, lvl + 1);
stk[++vf] = from;
}
}
void build(){
for(int j = 1; j <= vf; j++)
rmq[0][j] = {d[stk[j]], stk[j]};
int sz = log2(vf);
for(int i = 1; i <= sz; i++)
for(int j = 1; j <= vf; j++)
rmq[i][j] = (rmq[i - 1][j].mn < rmq[i - 1][j + (1 << (i - 1))].mn ? rmq[i - 1][j] : rmq[i - 1][j + (1 << (i - 1))]);
}
void solve(){
in >> x >> y;
x = poz[x];
y = poz[y];
if(x > y)
swap(x, y);
int dist = y - x + 1;
int sz = log2(dist);
out << (rmq[sz][x].mn < rmq[sz][y - (1 << sz) + 1].mn ? rmq[sz][x].lca : rmq[sz][y - (1 << sz) + 1].lca) << '\n';
}
int main(){
in >> n >> m;
for(int i = 2; i <= n; i++){
in >> x;
v[x].push_back(i);
}
dfs(1, 0);
build();
while(m--)
solve();
return 0;
}