Submission details
Task:Company Queries II
Sender:tjaa
Submission time:2025-10-22 13:45:20 +0300
Language:C++ (C++20)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.01 sdetails
#3ACCEPTED0.01 sdetails
#4ACCEPTED0.01 sdetails
#5ACCEPTED0.01 sdetails
#6ACCEPTED0.59 sdetails
#7ACCEPTED0.53 sdetails
#8ACCEPTED0.62 sdetails
#9ACCEPTED0.58 sdetails
#10ACCEPTED0.57 sdetails
#11ACCEPTED0.01 sdetails
#12ACCEPTED0.59 sdetails

Code

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5+1;
int vis[N];
int first[N];
int depth[N];
vector<vector<int>> adj(N);

const int eN = 2*N - 1;
int tot[eN];

void dfs(int n, int& i, int d=1) {
    vis[n] = 1;
    depth[n] = d;
    if(!first[n])
        first[n] = i;
    tot[i++] = n;
    for(auto e : adj[n]) {
        if(!vis[e]) {
            dfs(e, i, d+1);
            tot[i++]=n;
        }
    }
}

const int K = 20;
int st[K+1][eN];

void buildST(int* s, int len) {
    copy(s, s+len, st[0]);
    
    for (int i = 1; i <= K; i++)
        for (int j = 0; j + (1<<i) <= len; j++) {
            int a = st[i-1][j];
            int b = st[i-1][j + (1<<(i-1))];
            st[i][j] = depth[a] <= depth[b] ? a : b;
        }
}

int queryST(int l, int r) {
    if(l > r) swap(l, r);
    int i = bit_width(r-l+1ul) - 1;
    int a = st[i][l];
    int b = st[i][r-(1<<i)+1];
    return depth[a] <= depth[b] ? a : b;
}

int main () {
    int n, q;
    cin >> n >> q;

    for(int i = 2; i <= n; i++) {
        int e; cin >> e;
        adj[i].push_back(e);
        adj[e].push_back(i);
    }

    int i = 0;
    dfs(1, i);

    buildST(tot, i);

    while(q--) {
        int a, b;
        cin >> a >> b;
        cout << queryST(first[a], first[b]) << '\n';
    }

    return 0;
}

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
...