結果
問題 | No.789 範囲の合計 |
ユーザー | Suu0313 |
提出日時 | 2021-08-15 01:03:17 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 214 ms / 1,000 ms |
コード長 | 1,614 bytes |
コンパイル時間 | 2,256 ms |
コンパイル使用メモリ | 207,896 KB |
実行使用メモリ | 34,688 KB |
最終ジャッジ日時 | 2024-10-06 05:30:38 |
合計ジャッジ時間 | 5,549 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 1 ms
5,248 KB |
testcase_02 | AC | 201 ms
28,672 KB |
testcase_03 | AC | 96 ms
5,248 KB |
testcase_04 | AC | 214 ms
31,872 KB |
testcase_05 | AC | 178 ms
27,520 KB |
testcase_06 | AC | 191 ms
28,800 KB |
testcase_07 | AC | 92 ms
5,248 KB |
testcase_08 | AC | 191 ms
34,688 KB |
testcase_09 | AC | 174 ms
31,744 KB |
testcase_10 | AC | 181 ms
20,096 KB |
testcase_11 | AC | 156 ms
28,288 KB |
testcase_12 | AC | 156 ms
28,160 KB |
testcase_13 | AC | 2 ms
5,248 KB |
testcase_14 | AC | 2 ms
5,248 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; template<typename T> struct DynamicSegTree{ using OP = function<T(T,T)>; uint64_t n, n0; const T id; const OP op; DynamicSegTree(uint64_t n_, const T &id, const OP &op) : n(1), n0(n_), id(id),op(op){ while(n < n_) n<<=1; } void change(uint64_t k, const T &x){ root = change(root, k, x, 0, n); } T query(uint64_t l, uint64_t r) const { return query(root, l, r, 0, n); } T all_query() const { return query(0, n); } T at(uint64_t k) const { return query(k, k+1); } private: struct Node{ T val; Node *l, *r; Node(const T &v): val(v), l(nullptr), r(nullptr) {} } *root = nullptr; using np = Node*; T val(np t) const { return !t ? id : t->val; } np change(np t, uint64_t k, const T &x, uint64_t l, uint64_t r){ if(!t) t = new Node(id); if(l+1==r){ t->val = x; return t; } uint64_t m = l + ((r-l) >> 1); if(k < m) t->l = change(t->l, k, x, l, m); else t->r = change(t->r, k, x, m, r); t->val = op(val(t->l), val(t->r)); return t; } T query(np t, uint64_t ql, uint64_t qr, uint64_t l, uint64_t r) const { if(!t || r<=ql || qr<=l) return id; if(ql<=l && r<=qr) return t->val; uint64_t m = l + ((r-l) >> 1); return op(query(t->l, ql, qr, l, m), query(t->r, ql, qr, m, r)); } }; int main() { DynamicSegTree<uint64_t> seg(1000000001, 0, [](auto a, auto b){ return a+b; }); int n; cin >> n; uint64_t sum = 0; while(n--){ int t, x, y; cin >> t >> x >> y; if(t) sum += seg.query(x, y+1); else seg.change(x, seg.at(x) + y); } cout << sum << "\n"; }