Alfred's CP Library

This documentation is automatically generated by online-judge-tools/verification-helper

View on GitHub

:warning: src/jiangly/string/09A-Trie.hpp

Code

/**   字典树 Trie(例题)
 *    2023-09-26: https://qoj.ac/submission/188993
**/
constexpr int N = 1 << 18;

int mx[30][N];

void build(int d, int p, int l, int r, const std::vector<int> &v) {
    if (r - l == 1) {
        mx[d][p] = v[l];
        return;
    }
    int m = (l + r) / 2;
    build(d, 2 * p, l, m, v);
    build(d, 2 * p + 1, m, r, v);
    mx[d][p] = std::max(mx[d][2 * p], mx[d][2 * p + 1]);
}

int query(int d, int p, int l, int r, int x, int y) {
    if (l >= y || r <= x) {
        return -1;
    }
    if (l >= x && r <= y) {
        return mx[d][p];
    }
    int m = (l + r) / 2;
    return std::max(query(d, 2 * p, l, m, x, y), query(d, 2 * p + 1, m, r, x, y));
}

int main() {
    int N, Q;
    std::cin >> N >> Q;
    
    std::vector<int> A(N);
    for (int i = 0; i < N; i++) {
        std::cin >> A[i];
    }
    
    std::vector nxt(N + 1, std::vector<int>(30, N));
    for (int i = N - 1; i >= 0; i--) {
        nxt[i] = nxt[i + 1];
        for (int j = 0; j < 30; j++) {
            if (A[i] >> j & 1) {
                nxt[i][j] = i;
            }
        }
    }
    
    std::vector lst(N + 1, std::vector<int>(30, 0));
    for (int i = 0; i < N; i++) {
        lst[i + 1] = lst[i];
        for (int j = 0; j < 30; j++) {
            if (A[i] >> j & 1) {
                lst[i + 1][j] = i + 1;
            }
        }
    }
    std::vector<int> val(N, -1);
    for (int j = 29; j >= 0; j--) {
        for (int i = 0; i < N; i++) {
            if (A[i] >> j & 1) {
                val[i] = j;
            }
        }
        build(j, 1, 0, N, val);
    }
}
#line 1 "src/jiangly/string/09A-Trie.hpp"
/**   字典树 Trie(例题)
 *    2023-09-26: https://qoj.ac/submission/188993
**/
constexpr int N = 1 << 18;

int mx[30][N];

void build(int d, int p, int l, int r, const std::vector<int> &v) {
    if (r - l == 1) {
        mx[d][p] = v[l];
        return;
    }
    int m = (l + r) / 2;
    build(d, 2 * p, l, m, v);
    build(d, 2 * p + 1, m, r, v);
    mx[d][p] = std::max(mx[d][2 * p], mx[d][2 * p + 1]);
}

int query(int d, int p, int l, int r, int x, int y) {
    if (l >= y || r <= x) {
        return -1;
    }
    if (l >= x && r <= y) {
        return mx[d][p];
    }
    int m = (l + r) / 2;
    return std::max(query(d, 2 * p, l, m, x, y), query(d, 2 * p + 1, m, r, x, y));
}

int main() {
    int N, Q;
    std::cin >> N >> Q;
    
    std::vector<int> A(N);
    for (int i = 0; i < N; i++) {
        std::cin >> A[i];
    }
    
    std::vector nxt(N + 1, std::vector<int>(30, N));
    for (int i = N - 1; i >= 0; i--) {
        nxt[i] = nxt[i + 1];
        for (int j = 0; j < 30; j++) {
            if (A[i] >> j & 1) {
                nxt[i][j] = i;
            }
        }
    }
    
    std::vector lst(N + 1, std::vector<int>(30, 0));
    for (int i = 0; i < N; i++) {
        lst[i + 1] = lst[i];
        for (int j = 0; j < 30; j++) {
            if (A[i] >> j & 1) {
                lst[i + 1][j] = i + 1;
            }
        }
    }
    std::vector<int> val(N, -1);
    for (int j = 29; j >= 0; j--) {
        for (int i = 0; i < N; i++) {
            if (A[i] >> j & 1) {
                val[i] = j;
            }
        }
        build(j, 1, 0, N, val);
    }
}
Back to top page