Skip to the content.

:warning: library/query/OfflineRangeQuery.hpp

Depends on

Code

#include <vector>

class OfflineRangeQuery {
    size_t n, cnt;

    void add_query(size_t b_l, size_t b_r, size_t l, size_t r) {
        if (b_r < l || r < b_l)
            return;
        if (l <= b_l and b_r <= r) {
            querys[b_r].first.push_back(cnt);
            querys[b_l].second.push_back(cnt);
            return;
        }
        add_query(b_l, (b_l + b_r) >> 1, l, r);
        add_query((b_l + b_r) >> 1, b_r, l, r);
    }

  public:
    std::vector<std::pair<std::vector<size_t>, std::vector<size_t>>> querys;

    OfflineRangeQuery(size_t n_) : n(1), cnt(0), querys(n + 1) {
        while (n < n_)
            n <<= 1;
    }

    size_t add_query(size_t l, size_t r) {
        add_query(0, n, l, r);
        return cnt++;
    }
};
#line 1 "library/query/OfflineRangeQuery.hpp"
#include <vector>

class OfflineRangeQuery {
    size_t n, cnt;

    void add_query(size_t b_l, size_t b_r, size_t l, size_t r) {
        if (b_r < l || r < b_l)
            return;
        if (l <= b_l and b_r <= r) {
            querys[b_r].first.push_back(cnt);
            querys[b_l].second.push_back(cnt);
            return;
        }
        add_query(b_l, (b_l + b_r) >> 1, l, r);
        add_query((b_l + b_r) >> 1, b_r, l, r);
    }

  public:
    std::vector<std::pair<std::vector<size_t>, std::vector<size_t>>> querys;

    OfflineRangeQuery(size_t n_) : n(1), cnt(0), querys(n + 1) {
        while (n < n_)
            n <<= 1;
    }

    size_t add_query(size_t l, size_t r) {
        add_query(0, n, l, r);
        return cnt++;
    }
};
Back to top page