結果

問題 No.2710 How many more?
ユーザー commycommy
提出日時 2024-11-01 20:45:57
言語 C++23(gcc13)
(gcc 13.2.0 + boost 1.83.0)
結果
AC  
実行時間 69 ms / 2,000 ms
コード長 6,079 bytes
コンパイル時間 1,525 ms
コンパイル使用メモリ 118,656 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2024-11-01 20:46:01
合計ジャッジ時間 3,262 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,820 KB
testcase_01 AC 2 ms
6,816 KB
testcase_02 AC 52 ms
6,820 KB
testcase_03 AC 38 ms
6,816 KB
testcase_04 AC 41 ms
6,820 KB
testcase_05 AC 25 ms
6,820 KB
testcase_06 AC 36 ms
6,816 KB
testcase_07 AC 17 ms
6,816 KB
testcase_08 AC 18 ms
6,820 KB
testcase_09 AC 51 ms
6,816 KB
testcase_10 AC 29 ms
6,820 KB
testcase_11 AC 37 ms
6,820 KB
testcase_12 AC 64 ms
6,816 KB
testcase_13 AC 69 ms
6,816 KB
testcase_14 AC 69 ms
6,820 KB
testcase_15 AC 68 ms
6,816 KB
testcase_16 AC 69 ms
6,820 KB
testcase_17 AC 69 ms
6,820 KB
testcase_18 AC 2 ms
6,816 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
#include <limits>

#define rep(i, a, b) for (int i = int(a); i < int(b); i++)
using namespace std;
using ll = long long int;  // NOLINT
using P = pair<ll, ll>;

// clang-format off
#ifdef _DEBUG_
#define dump(...) do{ cerr << __LINE__ << ":\t" << #__VA_ARGS__ << " = "; debug_print(__VA_ARGS__); } while(false)
template<typename T, typename... Ts> void debug_print(const T &t, const Ts &...ts) { cerr << t; ((cerr << ", " << ts), ...); cerr << endl; }
#else
#define dump(...) do{ } while(false)
#endif
template<typename T> vector<T> make_v(size_t a, T b) { return vector<T>(a, b); }
template<typename... Ts> auto make_v(size_t a, Ts... ts) { return vector<decltype(make_v(ts...))>(a, make_v(ts...)); }
template<typename T> bool chmin(T &a, const T& b) { if (a > b) {a = b; return true; } return false; }
template<typename T> bool chmax(T &a, const T& b) { if (a < b) {a = b; return true; } return false; }
template<typename T, typename... Ts> void print(const T& t, const Ts&... ts) { cout << t; ((cout << ' ' << ts), ...); cout << '\n'; }
constexpr static struct PositiveInfinity { template<typename T> constexpr operator T() const { return numeric_limits<T>::max() / 2; } constexpr auto operator-() const; } inf;  // NOLINT
constexpr static struct NegativeInfinity { template<typename T> constexpr operator T() const { return numeric_limits<T>::lowest() / 2; } constexpr auto operator-() const; } NegativeInfinityVal;
constexpr auto PositiveInfinity::operator-() const { return NegativeInfinityVal; }
constexpr auto NegativeInfinity::operator-() const { return inf; }
// clang-format on

#include <algorithm>
#include <tuple>
#include <vector>
#include <type_traits>
template<typename T, typename E>
void compress_insert(std::vector<T> &inserter, const std::vector<E> &v) {
    inserter.insert(inserter.end(), v.begin(), v.end());
}
template<typename T, typename E>
std::vector<int> compress_update(std::vector<T> &inserter, const std::vector<E> &v) {
    std::vector<int> ret(v.size());
    std::transform(v.begin(), v.end(), ret.begin(), [&](const E &e) { return static_cast<int>(std::lower_bound(inserter.begin(), inserter.end(), e) - inserter.begin()); });
    return ret;
}
template<typename... Args>
auto compress(const Args &...args) {
    std::vector<std::common_type_t<typename Args::value_type...>> inserter;
    (..., compress_insert(inserter, args));
    sort(inserter.begin(), inserter.end());
    inserter.erase(unique(inserter.begin(), inserter.end()), inserter.end());
    return std::tuple_cat(std::make_tuple(inserter), std::make_tuple(compress_update(inserter, args)...));
}

#include <vector>
#include <bit>
namespace STF {
    template<typename T>
    [[maybe_unused]] constexpr static auto Sum = [](const T &a, const T &b) -> T { return a + b; };
    template<typename T>
    [[maybe_unused]] constexpr static auto Update = []([[maybe_unused]] const T &a, const T &b) -> T { return b; };
    template<typename T>
    [[maybe_unused]] constexpr static auto Min = [](const T &a, const T &b) -> T { return min(a, b); };
    template<typename T>
    [[maybe_unused]] constexpr static auto Max = [](const T &a, const T &b) -> T { return max(a, b); };
}  // namespace STF
template<typename T, typename UpdateFunction, typename QueryFunction>
class SegmentTree {
    std::vector<T> data;
    int n;
    UpdateFunction update_func;
    QueryFunction query_func;

public:
    SegmentTree(const std::vector<T> &v, const T &init, const UpdateFunction &uf, const QueryFunction &qf) : update_func(uf), query_func(qf) {
        n = static_cast<int>(v.size());
        int size = static_cast<int>(std::bit_ceil(v.size()));
        data.resize(2 * size, init);
        for (int i = 0; i < n; i++) {
            data[size + i] = v[i];
        }
        for (int i = size - 1; i >= 1; i--) {
            data[i] = query_func(data[2 * i], data[2 * i + 1]);
        }
    }
    SegmentTree(const int nv, const T &init, const UpdateFunction &uf, const QueryFunction &qf) : SegmentTree(std::vector<T>(nv, init), init, uf, qf) {}
    // 0-indexed
    void update(int pos, const T &val) {
        if (pos < 0 || pos >= n)
            return;
        pos += static_cast<int>(data.size()) / 2;
        data[pos] = update_func(data[pos], val);
        while (pos > 1) {
            pos >>= 1;
            data[pos] = query_func(data[2 * pos], data[2 * pos + 1]);
        }
    }
    // [l, r), 0-indexed
    T query(int l, int r) const {
        const T &init = data.front();
        if (l < 0 || r > n)
            return init;
        T res_l = init, res_r = init;
        int size = static_cast<int>(data.size()) / 2;
        for (l += size, r += size; l < r; l >>= 1, r >>= 1) {
            if (l & 1) {
                res_l = query_func(res_l, data[l++]);
            }
            if (r & 1) {
                res_r = query_func(data[--r], res_r);
            }
        }
        return query_func(res_l, res_r);
    }
};
template<typename T, typename UpdateFunction, typename QueryFunction>
SegmentTree(const std::vector<T> &, const T &, const UpdateFunction &, const QueryFunction &) -> SegmentTree<T, UpdateFunction, QueryFunction>;
template<typename T, typename UpdateFunction, typename QueryFunction>
SegmentTree(const int, const T &, const UpdateFunction &, const QueryFunction &) -> SegmentTree<T, UpdateFunction, QueryFunction>;

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int n, q;
    cin >> n >> q;
    vector<int> a(n);
    rep(i, 0, n) {
        cin >> a[i];
    }
    a = get<1>(compress(a));
    vector<int> cnt(a.size(), 0);
    rep(i, 0, a.size()) {
        cnt[a[i]]++;
    }
    SegmentTree seg(cnt, 0, STF::Update<int>, STF::Sum<int>);
    rep(i, 0, q) {
        int x, y;
        cin >> x >> y;
        x = a[x - 1];
        y = a[y - 1];
        dump(x, y);
        if (x <= y) {
            print(0);
        } else {
            print(seg.query(y + 1, x));
        }
    }

    return 0;
}
0