結果
| 問題 | No.875 Range Mindex Query |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-09-22 16:31:49 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,007 ms / 2,000 ms |
| コード長 | 1,818 bytes |
| 記録 | |
| コンパイル時間 | 224 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 102,892 KB |
| 最終ジャッジ日時 | 2024-07-05 07:06:48 |
| 合計ジャッジ時間 | 9,333 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
INF = 1 << 100
class RangeMinimumQuery(object):
def __init__(self, size):
self.size = size
self.round_up(size)
self.tree = [(INF, -1)] * (2*self.size-1)
def round_up(self, n):
self.size -= 1
i = 1
while self.size != (self.size | self.size >> i):
self.size |= self.size >> i
i *= 2
self.size += 1
def update(self, i, x):
"""A[i]をxに更新"""
ii = i+1
i += self.size-1
self.tree[i] = (x, ii)
while i > 0:
i = (i-1) // 2
if self.tree[2*i+1][0] < self.tree[2*i+2][0]:
self.tree[i] = self.tree[2*i+1]
else:
self.tree[i] = self.tree[2*i+2]
def find_minimum(self, l, r):
""""[l, r)の半開区間のAの最小値を返す"""
def query(ql, qr, k, l, r):
if qr <= l or r <= ql:
return (INF, -1)
if ql <= l <= r <= qr:
return self.tree[k]
left = query(ql, qr, 2*k+1, l, (l+r)//2)
right = query(ql, qr, 2*k+2, (l+r)//2, r)
if left[0] < right[0]:
return left
else:
return right
return query(l, r, 0, 0, self.size)
if __name__ == '__main__':
N, Q = map(int, input().split())
rmq = RangeMinimumQuery(N)
for i, a in enumerate(map(int, input().split())):
rmq.update(i, a)
result = []
for _ in range(Q):
op, l, r = map(int, input().split())
l -= 1; r -= 1
if op == 1:
lval, rval = rmq.tree[l+rmq.size-1], rmq.tree[r+rmq.size-1]
rmq.update(l, rval[0])
rmq.update(r, lval[0])
else:
result.append(rmq.find_minimum(l, r+1)[1])
print(*result, sep='\n')