結果
| 問題 |
No.789 範囲の合計
|
| コンテスト | |
| ユーザー |
kyo1
|
| 提出日時 | 2024-03-09 23:59:52 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 215 ms / 1,000 ms |
| コード長 | 2,571 bytes |
| コンパイル時間 | 1,505 ms |
| コンパイル使用メモリ | 136,256 KB |
| 実行使用メモリ | 34,688 KB |
| 最終ジャッジ日時 | 2024-09-29 21:23:49 |
| 合計ジャッジ時間 | 3,928 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 15 |
ソースコード
#include <bit>
#include <cassert>
#include <cstdint>
#include <iostream>
#include <memory>
#include <optional>
#include <random>
#include <unordered_map>
template <typename T, T Identity, auto Operate>
class DynamicSegmentTree {
public:
explicit DynamicSegmentTree(const std::size_t size)
: size(std::bit_ceil(size) << 1), root(std::make_unique<Node>(Identity)) {}
void update(const std::size_t index, const T value) {
assert(index < size);
update(root, 0, size, index, value);
}
T fold(const std::size_t left, const std::size_t right) const { // [left, right)
assert(left < right && right <= size);
return fold(root, left, right, 0, size);
}
private:
class Node {
private:
friend DynamicSegmentTree;
friend std::unique_ptr<Node> std::make_unique<Node>(T&&);
explicit Node(const T& value) : value(value) {}
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
T value;
};
void update(std::unique_ptr<Node>& node, std::size_t left, std::size_t right, std::size_t index,
const T& value) {
if (!node) node = std::make_unique<Node>(Identity);
if (left + 1 == right) {
node->value = value;
return;
}
const auto i = left + ((right - left) >> 1);
if (index < i) {
update(node->left, left, i, index, value);
} else {
update(node->right, i, right, index, value);
}
node->value = Operate(node->left ? node->left->value : Identity,
node->right ? node->right->value : Identity);
}
T fold(const std::unique_ptr<Node>& node, std::size_t left, std::size_t right, std::size_t l,
std::size_t r) const {
if (!node || right <= l || r <= left) return Identity;
if (left <= l && r <= right) return node->value;
const auto i = l + ((r - l) >> 1);
return Operate(fold(node->left, left, right, l, i), fold(node->right, left, right, i, r));
}
const std::size_t size;
std::unique_ptr<Node> root;
};
int main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int N;
std::cin >> N;
DynamicSegmentTree<int64_t, 0, [](const auto a, const auto b) { return a + b; }> dst(1000000001);
int64_t res = 0;
for (int i = 0; i < N; i++) {
int q;
std::cin >> q;
switch (q) {
case 0: {
int x, y;
std::cin >> x >> y;
dst.update(x, dst.fold(x, x + 1) + y);
break;
}
case 1: {
int l, r;
std::cin >> l >> r;
r++;
res += dst.fold(l, r);
}
}
}
std::cout << res << '\n';
return 0;
}
kyo1