Pagini recente » Cod sursa (job #1993913) | Cod sursa (job #159909) | Cod sursa (job #2066719) | Cod sursa (job #1982168) | Cod sursa (job #2715533)
#include <bits/stdc++.h>
using namespace std;
ifstream r("lca.in");
ofstream w("lca.out");
int prima[400003], rmq[20][400003];
vector<int> g[100003];
vector<pair<int, int>>e;
void dfs(int nod, int niv){
if(nod!=1 && prima[nod]==0){
prima[nod]=e.size();
}
e.push_back(make_pair(nod, niv));
for(auto it: g[nod]){
dfs(it, niv+1);
e.push_back(make_pair(nod, niv));
}
}
void init(){
int cnt=e.size();
for(int i = 1; i <= cnt; i++) {
rmq[0][i] = i;
}
for(int i = 1; (1 << i) <= cnt; i++) {
for(int j = 1; j + (1 << i) <= cnt; j++) {
if(e[rmq[i - 1][j]].second<= e[rmq[i - 1][j + (1 << (i - 1))]].second) {
rmq[i][j] = rmq[i - 1][j];
}
else {
rmq[i][j] = rmq[i - 1][j + (1 << (i - 1))];
}
}
}
}
int querry(int st, int dr){
int line, skip, ans;
skip = dr - st + 1;
line = log2(skip);
if(e[rmq[line][st]].second<= e[rmq[line][st + skip - (1 << line)]].second) {
ans = rmq[line][st];
}
else {
ans = rmq[line][st + skip - (1 << line)];
}
return e[ans].first;
}
int main()
{
int n, m;
r>>n>>m;
for(int i=2;i<=n;i++){
int x;
r>>x;
g[x].push_back(i);
}
dfs(1, 0);
init();
for(int i=0;i<m;i++){
int a, b;
r>>a>>b;
if(prima[a]>prima[b]){
swap(a, b);
}
w<<querry(prima[a], prima[b])<<"\n";
}
return 0;
}