結果
| 問題 |
No.1441 MErGe
|
| コンテスト | |
| ユーザー |
c-yan
|
| 提出日時 | 2021-03-28 23:23:50 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,901 bytes |
| コンパイル時間 | 481 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 54,068 KB |
| 最終ジャッジ日時 | 2024-11-29 09:32:55 |
| 合計ジャッジ時間 | 54,553 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 2 |
| other | WA * 3 TLE * 25 |
ソースコード
from sys import setrecursionlimit, stdin
from itertools import accumulate
from bisect import bisect_left
class RangeAddSegmentTree:
def __init__(self, size):
self._size = size
t = 1
while t < size:
t *= 2
self._offset = t - 1
self._data = [0] * (t * 2 - 1)
def __len__(self):
return self._size
def range_add(self, start, stop, x):
data = self._data
l = start + self._offset
r = stop + self._offset
while l < r:
if l & 1 == 0:
data[l] += x
if r & 1 == 0:
data[r - 1] += x
l = l // 2
r = (r - 1) // 2
def __setitem__(self, key, val):
self.range_add(key, key + 1, val - self[key])
def __getitem__(self, key):
data = self._data
i = key + self._offset
result = data[i]
while i > 0:
i = (i - 1) // 2
result += data[i]
return result
def __iter__(self):
for i in range(self._size):
yield self[i]
readline = stdin.readline
setrecursionlimit(10 ** 6)
N, Q = map(int, readline().split())
A = list(map(int, readline().split()))
A = list(accumulate(A))
st = RangeAddSegmentTree(N + 1)
for i in range(N + 1):
st.range_add(i, i + 1, i)
result = []
for _ in range(Q):
T, l, r = map(int, readline().split())
l, r = l - 1, r - 1
x = bisect_left(st, l)
y = bisect_left(st, r + 1) - 1
if T == 1:
for j in range(l + 1, r+1):
#print("add", bisect_left(st, j), bisect_left(st, j + 1), l - j)
st.range_add(bisect_left(st, j), bisect_left(st, j + 1), l - j)
st.range_add(y + 1, N + 1, l - r)
print(*st)
elif T == 2:
if x != 0:
result.append(A[y] - A[x - 1])
else:
result.append(A[y])
print(*result, sep='\n')
c-yan