結果
| 問題 |
No.789 範囲の合計
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 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)
norioc