結果
| 問題 |
No.1234 典型RMQ
|
| コンテスト | |
| ユーザー |
c-yan
|
| 提出日時 | 2021-02-07 03:31:02 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,743 bytes |
| コンパイル時間 | 120 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 33,376 KB |
| 最終ジャッジ日時 | 2024-07-03 15:16:53 |
| 合計ジャッジ時間 | 4,357 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 3 |
| other | AC * 6 TLE * 1 -- * 20 |
ソースコード
from sys import stdin, setrecursionlimit
class SegmentTree:
DEFAULT_VALUE = 10 ** 18
DEFAULT_LAZY = 0
op = min
def __init__(self, size):
self._size = size
t = 1
while t < size:
t *= 2
self._offset = t - 1
self._values = [SegmentTree.DEFAULT_VALUE] * (t * 2 - 1)
self._lazy = [SegmentTree.DEFAULT_LAZY] * (t * 2 - 1)
def build(self, iterable):
op = SegmentTree.op
values = self._values
values[self._offset:self._offset + self._size] = iterable
for i in range(self._offset - 1, -1, -1):
values[i] = SegmentTree.op(values[i * 2 + 1], values[i * 2 + 2])
def _iter_segmen_indexes(self, start, stop):
l = start + self._offset
r = stop + self._offset
while l < r:
if l & 1 == 0:
yield l
if r & 1 == 0:
yield r - 1
l = l // 2
r = (r - 1) // 2
def _propagate(self, start, stop):
lazy = self._lazy
values = self._values
indexes = set()
for i in self._iter_segmen_indexes(start, stop):
if i == 0:
return
while i != 0:
i = (i - 1) // 2
indexes.add(i)
for i in sorted(indexes):
l = lazy[i]
if l == SegmentTree.DEFAULT_LAZY:
continue
lazy[i * 2 + 1] += l
values[i * 2 + 1] += l
lazy[i * 2 + 2] += l
values[i * 2 + 2] += l
lazy[i] = SegmentTree.DEFAULT_LAZY
def _apply_to(self, index, value):
op = SegmentTree.op
values = self._values
self._lazy[index] += value
values[index] += value
while index >= 1:
index = (index - 1) // 2
values[index] = op(values[index * 2 + 1], values[index * 2 + 2])
def apply(self, start, stop, value):
self._propagate(start, stop)
for i in self._iter_segmen_indexes(start, stop):
self._apply_to(i, value)
def query(self, start, stop):
op = SegmentTree.op
values = self._values
self._propagate(start, stop)
result = SegmentTree.DEFAULT_VALUE
for i in self._iter_segmen_indexes(start, stop):
result = op(result, values[i])
return result
readline = stdin.readline
setrecursionlimit(10 ** 6)
N = int(readline())
a = list(map(int, readline().split()))
Q = int(readline())
st = SegmentTree(N)
st.build(a)
result = []
for _ in range(Q):
k, l, r, c = map(int, readline().split())
if k == 1:
st.apply(l - 1, r, c)
elif k == 2:
result.append(st.query(l - 1, r))
print(*result, sep='\n')
c-yan