結果
問題 |
No.789 範囲の合計
|
ユーザー |
![]() |
提出日時 | 2025-03-11 03:04:01 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 2,001 bytes |
コンパイル時間 | 593 ms |
コンパイル使用メモリ | 82,104 KB |
実行使用メモリ | 183,340 KB |
最終ジャッジ日時 | 2025-03-11 03:04:05 |
合計ジャッジ時間 | 4,332 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 2 MLE * 1 -- * 12 |
ソースコード
class DynamicSegTree: def __init__(self, op, e, size): self.op = op self.e = e self.size = size # [0, size) self.data = {} def _update(self, p, x, k, l, r): """ 再帰的に p 番目の値を x に更新し、区間情報を更新する k: 現在のノード番号(根は 1) [l, r): 現在の区間 """ if r - l == 1: self.data[k] = x return x mid = (l + r) // 2 if p < mid: self._update(p, x, 2 * k, l, mid) else: self._update(p, x, 2 * k + 1, mid, r) lval = self.data.get(2 * k, self.e) rval = self.data.get(2 * k + 1, self.e) self.data[k] = self.op(lval, rval) return self.data[k] def set(self, p: int, val): """位置 p の値を x に更新 (一点更新)""" self._update(p, val, 1, 0, self.size) def _prod(self, a, b, k, l, r): """ 再帰的に区間 [a, b) のクエリを行う k: 現在のノード番号(根は 1) [l, r): 現在の区間 """ if r <= a or b <= l: return self.e # 完全に区間外の場合は単位元 if a <= l and r <= b: return self.data.get(k, self.e) mid = (l + r) // 2 vl = self._prod(a, b, 2 * k, l, mid) vr = self._prod(a, b, 2 * k + 1, mid, r) return self.op(vl, vr) def prod(self, l, r): """区間取得 [l, r)""" return self._prod(l, r, 1, 0, self.size) def get(self, p): assert 0 <= p <= self.size return self.prod(p, p + 1) N = int(input()) dsegt = DynamicSegTree(lambda a, b: a+b, 0, 10**9+10) ans = 0 for _ in range(N): qs = list(map(int, input().split())) if qs[0] == 0: x, y = qs[1], qs[2] dsegt.set(x, dsegt.get(x) + y) elif qs[0] == 1: l, r = qs[1], qs[2] res = dsegt.prod(l, r+1) ans += res print(ans)