| Task: | Company Queries II |
| Sender: | aalto26gh_046 |
| Submission time: | 2026-10-11 16:39:07 +0300 |
| Language: | C++ (C++20) |
| Status: | READY |
| Result: | ACCEPTED |
| test | verdict | time | |
|---|---|---|---|
| #1 | ACCEPTED | 0.00 s | details |
| #2 | ACCEPTED | 0.00 s | details |
| #3 | ACCEPTED | 0.00 s | details |
| #4 | ACCEPTED | 0.00 s | details |
| #5 | ACCEPTED | 0.00 s | details |
| #6 | ACCEPTED | 0.79 s | details |
| #7 | ACCEPTED | 0.59 s | details |
| #8 | ACCEPTED | 0.69 s | details |
| #9 | ACCEPTED | 0.86 s | details |
| #10 | ACCEPTED | 0.80 s | details |
| #11 | ACCEPTED | 0.00 s | details |
| #12 | ACCEPTED | 0.92 s | details |
Code
#include <iostream>
#include <vector>
#include <utility>
int ancestor(int node, int depth, std::vector<std::vector<int>> &boss_of_powers) {
int power = 0;
int number = 1;
while (number <= depth) {
power++;
number *= 2;
}
for (int i = power-1; i >= 0; --i) {
number /= 2;
if (depth >= number) {
node = boss_of_powers[node][i];
depth -= number;
}
}
return node;
}
int find_common_ancestor(int node1, int node2, int max_depth, std::vector<std::vector<int>> &boss_of_powers) {
if (node1 == node2) return node1;
if (boss_of_powers[node1][0] == boss_of_powers[node2][0]) return boss_of_powers[node1][0];
int power = 0;
int number = 1;
while (number <= max_depth) {
power++;
number *= 2;
}
for (int i = power-1; i >= 0; --i) {
number /= 2;
if (boss_of_powers[node1][i] != boss_of_powers[node2][i]) {
return find_common_ancestor(boss_of_powers[node1][i], boss_of_powers[node2][i], max_depth-number, boss_of_powers);
}
}
return 0;
}
int main() {
int n, q;
std::cin >> n >> q;
std::vector<std::vector<int>> boss_of_powers(n+1, std::vector(1, 0));
for (int i = 2; i <= n; ++i) {
std::cin >> boss_of_powers[i][0];
}
int power = 1;
int number = 2;
while (number <= n) {
for (int i = 0; i <= n; ++i) {
int boss = boss_of_powers[boss_of_powers[i][power-1]][power-1];
boss_of_powers[i].push_back(boss);
}
power++;
number *= 2;
}
std::vector<int> depths(n+1, 0);
for (int i = 2; i <= n; ++i) {
depths[i] = depths[boss_of_powers[i][0]] + 1;
}
std::vector<std::pair<int, int>> queries(q);
for (auto &query : queries) {
std::cin >> query.first >> query.second;
}
std::vector<int> results(q);
for (int i = 0; i < q; ++i) {
int node1 = queries[i].first;
int node2 = queries[i].second;
//std::cout << node1 << " " << node2 << " " << depths[node1] << " " << depths[node2] << std::endl;
if (depths[node1] < depths[node2]) {
node2 = ancestor(node2, depths[node2] - depths[node1], boss_of_powers);
}
if (depths[node1] > depths[node2]) {
node1 = ancestor(node1, depths[node1] - depths[node2], boss_of_powers);
}
//std::cout << node1 << " " << node2 << " " << depths[node1] << std::endl;
results[i] = find_common_ancestor(node1, node2, depths[node1], boss_of_powers);
}
for (auto &result : results) {
std::cout << result << std::endl;
}
}Test details
Test 1
Verdict: ACCEPTED
| input |
|---|
| 10 10 1 2 3 4 5 6 7 8 9 6 9 8 10 10 3 ... |
| correct output |
|---|
| 6 8 3 1 8 ... |
| user output |
|---|
| 6 8 3 1 8 ... |
Test 2
Verdict: ACCEPTED
| input |
|---|
| 10 10 1 1 1 1 1 1 1 1 1 1 7 3 4 4 1 ... |
| correct output |
|---|
| 1 1 1 1 1 ... |
| user output |
|---|
| 1 1 1 1 1 ... |
Test 3
Verdict: ACCEPTED
| input |
|---|
| 10 10 1 1 1 1 2 3 4 4 1 1 8 2 7 8 3 ... |
| correct output |
|---|
| 1 1 1 1 1 ... |
| user output |
|---|
| 1 1 1 1 1 ... |
Test 4
Verdict: ACCEPTED
| input |
|---|
| 10 10 1 1 3 1 2 2 5 3 9 7 2 7 6 3 9 ... |
| correct output |
|---|
| 2 2 3 1 1 ... |
| user output |
|---|
| 2 2 3 1 1 ... |
Test 5
Verdict: ACCEPTED
| input |
|---|
| 10 10 1 2 3 2 5 3 2 2 4 6 1 1 3 1 9 ... |
| correct output |
|---|
| 1 1 1 2 2 ... |
| user output |
|---|
| 1 1 1 2 2 ... |
Test 6
Verdict: ACCEPTED
| input |
|---|
| 200000 200000 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
| correct output |
|---|
| 74862 8750 16237 72298 58111 ... |
| user output |
|---|
| 74862 8750 16237 72298 58111 ... |
Test 7
Verdict: ACCEPTED
| input |
|---|
| 200000 200000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| correct output |
|---|
| 1 1 1 1 1 ... |
| user output |
|---|
| 1 1 1 1 1 ... |
Test 8
Verdict: ACCEPTED
| input |
|---|
| 200000 200000 1 2 1 2 3 2 1 6 3 1 10 12 13 4... |
| correct output |
|---|
| 1 2 2 2 1 ... |
| user output |
|---|
| 1 2 2 2 1 ... |
Test 9
Verdict: ACCEPTED
| input |
|---|
| 200000 200000 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
| correct output |
|---|
| 2796 633 633 151 2690 ... |
| user output |
|---|
| 2796 633 633 151 2690 ... |
Test 10
Verdict: ACCEPTED
| input |
|---|
| 200000 200000 1 2 3 4 5 6 7 8 9 10 11 12 13 ... |
| correct output |
|---|
| 365 73 103 365 216 ... |
| user output |
|---|
| 365 73 103 365 216 ... |
Test 11
Verdict: ACCEPTED
| input |
|---|
| 2 4 1 1 1 1 2 2 1 ... |
| correct output |
|---|
| 1 1 1 2 |
| user output |
|---|
| 1 1 1 2 |
Test 12
Verdict: ACCEPTED
| input |
|---|
| 200000 200000 1 1 2 3 4 5 6 7 8 9 10 11 12 1... |
| correct output |
|---|
| 27468 6353 27468 6353 6353 ... |
| user output |
|---|
| 27468 6353 27468 6353 6353 ... |
