結果
問題 | No.875 Range Mindex Query |
ユーザー | shinichi |
提出日時 | 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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 37 ms
52,480 KB |
testcase_01 | AC | 92 ms
75,648 KB |
testcase_02 | AC | 97 ms
76,032 KB |
testcase_03 | AC | 54 ms
64,512 KB |
testcase_04 | AC | 79 ms
75,904 KB |
testcase_05 | AC | 56 ms
65,280 KB |
testcase_06 | AC | 97 ms
75,648 KB |
testcase_07 | AC | 115 ms
75,904 KB |
testcase_08 | AC | 86 ms
76,288 KB |
testcase_09 | AC | 85 ms
75,776 KB |
testcase_10 | AC | 107 ms
76,672 KB |
testcase_11 | AC | 791 ms
94,868 KB |
testcase_12 | AC | 623 ms
91,904 KB |
testcase_13 | AC | 622 ms
91,952 KB |
testcase_14 | AC | 568 ms
91,584 KB |
testcase_15 | AC | 687 ms
94,500 KB |
testcase_16 | AC | 1,007 ms
102,056 KB |
testcase_17 | AC | 999 ms
102,620 KB |
testcase_18 | AC | 997 ms
102,892 KB |
ソースコード
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')