結果
問題 | 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')