Pagini recente » Cod sursa (job #2294079) | Cod sursa (job #1269858) | Cod sursa (job #2710084) | Cod sursa (job #2346789) | Cod sursa (job #2871874)
#include <fstream>
#include <vector>
#include <map>
std::ifstream f("lca.in");
std::ofstream g("lca.out");
struct index_info {
int node;
int level;
};
int N, M, x, y, val, log_mem[200003], D[21][200003], pos_in_tour[200003];
std::vector<int> G[100003];
std::vector<index_info> euler_tour;
inline void preprocess_log()
{
log_mem[0] = -1;
for(int i = 1; i <= euler_tour.size() - 1; i++) {
log_mem[i] = log_mem[i / 2] + 1;
D[0][i] = i;
}
}
void do_euler_tour(int nod = 1, int level = 1)
{
if(!pos_in_tour[nod]) {
euler_tour.push_back({nod, level});
pos_in_tour[nod] = euler_tour.size() - 1;
for(auto &val: G[nod]) {
do_euler_tour(val, level + 1);
euler_tour.push_back({nod, level});
}
}
}
int main()
{
f >> N >> M;
for(int i = 2; i <= N; i++) {
f >> x;
G[x].push_back(i);
}
euler_tour.push_back({0, 0});
do_euler_tour();
preprocess_log();
for(int i = 1; i <= log_mem[euler_tour.size() - 1]; i++) {
for(int j = 1; j <= euler_tour.size() - (1 << i); j++) {
if(euler_tour[D[i - 1][j]].level < euler_tour[D[i - 1][j + (1 << i - 1)]].level)
D[i][j] = D[i - 1][j];
else
D[i][j] = D[i - 1][j + (1 << i - 1)];
}
}
for(int i = 1; i <= M; i++) {
f >> x >> y;
int x1 = pos_in_tour[x], x2 = pos_in_tour[y];
if(x1 == x2)
g << euler_tour[x1].node << "\n";
else {
if(x1 > x2) std::swap(x1, x2);
int k = log_mem[x2 - x1];
if(euler_tour[D[k][x1]].level < euler_tour[D[k][x2 - (1 << k) + 1]].level)
g << euler_tour[D[k][x1]].node << "\n";
else
g << euler_tour[D[k][x2 - (1 << k) + 1]].node << "\n";
}
}
return 0;
}