Pagini recente » Cod sursa (job #463438) | Cod sursa (job #1687146) | Cod sursa (job #2449117) | Cod sursa (job #1751620) | Cod sursa (job #3225152)
#include<bits/stdc++.h>
std::ifstream fin("lca.in");
std::ofstream fout("lca.out");
struct elem{
int info, niv;
};
const int MAX = 1e5 + 5;
const int LOG_MAX = 18;
elem rmq[LOG_MAX][2 * MAX];
std::vector<int> G[MAX];
int E[2 * MAX], poz[2 * MAX];
int n, m, x, y, cnt;
void DFS(int start, int niv){
rmq[0][++cnt] = (elem){start, niv};
poz[start] = cnt;
for(const int& x : G[start]){
DFS(x, niv + 1);
rmq[0][++cnt] = (elem){start, niv};
}
}
int main(){
fin >> n >> m;
for(int i = 2; i <= n; ++i){
fin >> x;
G[x].push_back(i);
}
DFS(1, 1);
for(int i = 1; (1 << i) <= cnt; ++i)
for(int j = 1; j <= cnt; ++j){
rmq[i][j] = rmq[i - 1][j];
int val = j + (1 << (i - 1));
if(val <= cnt and rmq[i - 1][val].niv < rmq[i][j].niv)
rmq[i][j] = rmq[i - 1][val];
}
E[1] = 0;
for(int i = 2; i <= cnt; ++i)
E[i] = 1 + E[i / 2];
for(;m;--m){
fin >> x >> y;
x = poz[x];
y = poz[y];
if(x > y)
std::swap(x, y);
int len = y - x + 1, e = E[len];
if(rmq[e][x].niv > rmq[e][y - (1 << e) + 1].niv)
fout << rmq[e][y - (1 << e) + 1].info << '\n';
else
fout << rmq[e][x].info << '\n';
}
}