結果
| 問題 | No.875 Range Mindex Query |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-09-04 03:54:52 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 483 ms / 2,000 ms |
| コード長 | 1,756 bytes |
| 記録 | |
| コンパイル時間 | 403 ms |
| コンパイル使用メモリ | 82,432 KB |
| 実行使用メモリ | 121,244 KB |
| 最終ジャッジ日時 | 2024-12-16 04:07:25 |
| 合計ジャッジ時間 | 6,918 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#!/usr/bin/env python3
# from typing import *
import sys
import io
import math
import collections
import decimal
import itertools
import bisect
import heapq
def input():
return sys.stdin.readline()[:-1]
# sys.setrecursionlimit(1000000)
# _INPUT = """3 3
# 2 1 3
# 2 1 3
# 1 2 3
# 2 1 3
# """
# sys.stdin = io.StringIO(_INPUT)
INF = 10**10
class SegTree_Update_QRMin:
def __init__(self, a) -> None:
n = len(a)
self.N0 = 1 << (n-1).bit_length()
self.data = ([(INF, 0)] * self.N0) + a + ([(INF, 0)] * (self.N0-n))
for i in reversed(range(1, self.N0)):
self.data[i] = min(self.data[i*2], self.data[i*2+1])
def update(self, i, x):
i += self.N0
self.data[i] = x
while i > 0:
i >>= 1
self.data[i] = min(self.data[i*2], self.data[i*2+1])
def query_rmin(self, l, r):
l += self.N0
r += self.N0
s = (INF, 0)
while l < r:
if l & 1:
s = min(s, self.data[l])
l += 1
if r & 1:
s = min(s, self.data[r-1])
r -= 1
l >>= 1
r >>= 1
return s
def get_value(self, i):
return self.data[i+self.N0]
N, Q = map(int, input().split())
A = list(map(lambda x: int(x)-1, input().split()))
seg_tree = SegTree_Update_QRMin([(a, i) for i, a in enumerate(A)])
for _ in range(Q):
i, l, r = map(int, input().split())
l -= 1
r -= 1
if i == 1:
v_l = seg_tree.get_value(l)
v_r = seg_tree.get_value(r)
seg_tree.update(l, (v_r[0], l))
seg_tree.update(r, (v_l[0], r))
else:
m = seg_tree.query_rmin(l, r+1)
ans = m[1] + 1
print(ans)