結果
| 問題 |
No.789 範囲の合計
|
| コンテスト | |
| ユーザー |
AC2K
|
| 提出日時 | 2023-03-06 21:00:02 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 208 ms / 1,000 ms |
| コード長 | 2,891 bytes |
| コンパイル時間 | 1,989 ms |
| コンパイル使用メモリ | 197,112 KB |
| 最終ジャッジ日時 | 2025-02-11 05:56:01 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge6 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 15 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
template<class S,S(*op)(S,S),S(*e)()>
class dynamic_segtree {
public:
dynamic_segtree(const size_t& n) :n(n), root(nullptr) {}
private:
struct node {
S val;
node* left;
node* right;
node(const S& v) :val(v), left(nullptr), right(nullptr) {}
};
node* root;
size_t n;
public:
void update(const size_t& p, const S& x) { internal_update(root, 0, n, p, x); }
void add(const size_t& p, const S& x) { internal_add(root, 0, n, p, x); }
S operator[](const size_t& p) { return internal_access(root, 0, n, p); }
S prod(const size_t& l, const size_t& r) { return internal_prod(root, 0, n, l, r); }
private:
void internal_update(node*& p, const size_t& l, const size_t& r, const size_t& idx, const S& new_val) {
if (p == nullptr) {
p = new node(e());
}
if (r - l == 1) {
p->val = new_val;
return;
}
size_t mid = (l + r) >> 1;
if (idx < mid) internal_update(p->left, l, mid, idx, new_val);
else internal_update(p->right, mid, r, idx, new_val);
p->val = e();
if (p->left!=nullptr) p->val = op(p->left->val, p->val);
if (p->right!=nullptr) p->val = op(p->val, p->right->val);
}
void internal_add(node*& p, const size_t& l, const size_t& r, const size_t& idx, const S& new_val) {
if (p == nullptr) {
p = new node(e());
}
if (r - l == 1) {
p->val = op(p->val, new_val);;
return;
}
size_t mid = (l + r) >> 1;
if (idx < mid) internal_add(p->left, l, mid, idx, new_val);
else internal_add(p->right, mid, r, idx, new_val);
p->val = e();
if (p->left!=nullptr) p->val = op(p->left->val, p->val);
if (p->right!=nullptr) p->val = op(p->val, p->right->val);
}
S internal_access(node*& p, const size_t& l, const size_t& r, const size_t& idx) {
if (p == nullptr) {
return e();
}
if (r - l == 1) {
return p->val;
}
size_t mid = (l + r) >> 1;
if (idx < mid) return internal_access(p->left, l, mid, idx);
else return internal_access(p->right, mid, r, idx);
}
S internal_prod(node*& p, const size_t& l, const size_t& r, const size_t& L, const size_t& R) {
if (p == nullptr || r <= L || R <= l) {
return e();
}
if (L <= l && r <= R) {
return p->val;
}
size_t mid = (l + r) >> 1;
return op(internal_prod(p->left, l, mid, L, R), internal_prod(p->right, mid, r, L, R));
}
};
int op(int x, int y) { return x + y; }
int e() { return 0; }
int main() {
const size_t n = 1000000001;
dynamic_segtree<int, op, e> seg(n);
int q;
cin >> q;
long long ans = 0;
while (q--) {
int type;
cin >> type;
if (type == 0) {
size_t x;
long long y;
cin >> x >> y;
seg.add(x, y);
}
else {
size_t l, r;
cin >> l >> r;
ans += seg.prod(l, r + 1);
//cout << "ANS:" << seg.prod(l, r + 1) << '\n';
}
/*
cout << "[";
for (int i = 0; i < 20; i++) {
cout << seg[i] << ' ';
}
cout << "]\n";
*/
}
cout << ans << '\n';
}
AC2K