結果
| 問題 | No.875 Range Mindex Query |
| コンテスト | |
| ユーザー |
wattaihei
|
| 提出日時 | 2019-10-11 14:01:56 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,373 bytes |
| 記録 | |
| コンパイル時間 | 548 ms |
| コンパイル使用メモリ | 12,544 KB |
| 実行使用メモリ | 67,916 KB |
| 最終ジャッジ日時 | 2024-11-24 14:20:15 |
| 合計ジャッジ時間 | 24,040 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 10 TLE * 8 |
ソースコード
import sys
input = sys.stdin.readline
N_, Q = map(int, input().split())
A = list(map(int, input().split()))
Query = [list(map(lambda x: int(x)-1, input().split())) for _ in range(Q)]
# 初期化最大値
max_N = (1 << 31) - 1
# 要素数を2の累乗にしておく
N = 1
while N < N_:
N *= 2
# Segment Tree
seg = [[max_N, 0] for _ in range(2*N-1)]
# k番目の値(0-indexed)をaに変更
def update(k, a):
k += N - 1
seg[k][0] = a
seg[k][1] = k-N+1
while k > 0:
k = (k-1)//2
if seg[2*k+1][0] > seg[2*k+2][0]:
seg[k] = seg[2*k+2]
else:
seg[k] = seg[2*k+1]
# [l, r)の最小値取得
# kがNodeの番号、対応する区間が[a, b)
def query_min(l, r, k=0, a=0, b=N):
# 交差してなければmax_N
if b <= l or r <= a:
return [max_N, 0]
# 含んでいたらNodeの値
if l <= a and b <= r:
return seg[k]
# それ以外なら子を見る
else:
vl = query_min(l, r, k*2+1, a, (a+b)//2)
vr = query_min(l, r, k*2+2, (a+b)//2, b)
if vl[0] > vr[0]:
return vr
else:
return vl
for i, a in enumerate(A):
update(i, a)
for com, l, r in Query:
if com == 0:
al = seg[l+N-1][0]
ar = seg[r+N-1][0]
update(l, ar)
update(r, al)
else:
print(query_min(l, r+1)[1]+1)
wattaihei