Pagini recente » Cod sursa (job #312442) | Cod sursa (job #2250116) | Cod sursa (job #2608222) | Cod sursa (job #1803472) | Cod sursa (job #2093012)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int MAX = 1e5 + 7;
vector < int > tata(MAX);
vector < int > level(MAX);
vector < vector < int > > chain(MAX);
vector < int > chain_of(MAX);
vector < vector < int > > gr(MAX);
void Dfs(int cur_node, int cur_level, int &chain_nr, int &lim) {
level[cur_node] = cur_level;
if (gr[cur_node].size() == 0) {
chain[++ chain_nr].push_back(cur_node);
chain_of[cur_node] = chain_nr;
return;
}
bool found_not_full = false;
for (auto x : gr[cur_node]) {
Dfs(x, cur_level + 1, chain_nr, lim);
if (not found_not_full) {
if ((int) chain[chain_of[x]].size() < lim) {
found_not_full = true;
chain[chain_of[x]].push_back(cur_node);
chain_of[cur_node] = chain_of[x];
}
}
}
if (not found_not_full) {
chain[++ chain_nr].push_back(cur_node);
chain_of[cur_node] = chain_nr;
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 2; i <= n; i ++) {
cin >> tata[i];
gr[tata[i]].push_back(i);
}
int lim = sqrt(n);
int max_chain = 0;
Dfs(1, 1, max_chain, lim);
int x, y;
for (int i = 1; i <= m; i ++) {
cin >> x >> y;
while(chain_of[x] != chain_of[y]) {
int vf_x = chain[chain_of[x]].back();
int vf_y = chain[chain_of[y]].back();
if (level[vf_x] >= level[vf_y]) {
x = tata[vf_x];
}
else {
y = tata[vf_y];
}
}
if (level[x] <= level[y]) {
cout << x << '\n';
}
else {
cout << y << '\n';
}
}
}