Submission details
Task:Company Queries II
Sender:Wuppfler
Submission time:2026-10-09 16:07:00 +0300
Language:C++ (C++20)
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.00 sdetails
#3ACCEPTED0.00 sdetails
#4ACCEPTED0.00 sdetails
#5ACCEPTED0.00 sdetails
#60.14 sdetails
#7ACCEPTED0.59 sdetails
#8ACCEPTED0.69 sdetails
#90.14 sdetails
#100.14 sdetails
#11ACCEPTED0.00 sdetails
#120.14 sdetails

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 = 1; 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:

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
(empty)

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:

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
(empty)

Test 10

Verdict:

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
(empty)

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:

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
(empty)