結果

問題 No.875 Range Mindex Query
ユーザー もろこし
提出日時 2025-09-26 13:14:27
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,297 bytes
コンパイル時間 553 ms
コンパイル使用メモリ 82,388 KB
実行使用メモリ 99,068 KB
最終ジャッジ日時 2025-09-26 13:14:37
合計ジャッジ時間 8,605 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other WA * 18
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
sys.setrecursionlimit(10**7)
def ii(): return int(input())
def ist(): return input().split()
def mi(d=0): return map(lambda x:int(x)-d,input().split())
def lmi(d=0): return list(map(lambda x:int(x)-d,input().split()))
INF = 998244353
def answer(s):
  print(s)
  exit()
def cross(xy):
  x,y = xy
  return (x+1,y),(x-1,y),(x,y+1),(x,y-1)
################################################
class SegTree:
  def __init__(self,n,inf,order,arr):
    self.inf = inf
    self.order = order
    self.bitlen = 2**n.bit_length()
    self.len = n
    self.n = self.bitlen*2-1
    arr += [inf]*(self.bitlen - n)
    self.arr = [None]*(self.bitlen-1) + arr

    def PreProcessing(index):
      if self.arr[index] == None:
        self.arr[index] = self.order(PreProcessing(2*index+1),PreProcessing(2*index+2))
      return self.arr[index]
    PreProcessing(0)
  
  #データ更新:index番目をxに変更
  def Renew(self,index,x):
    i = self.n - self.bitlen + index
    self.arr[i] = x
    while i != 0:
      i = (i-1)//2
      result = self.order(self.arr[i*2+1],self.arr[i*2+2])
      if result != self.arr[i]:
        self.arr[i] = result
  def Swap(self,l,r):
    left,right = self.arr[self.bitlen-1+l],self.arr[self.bitlen-1+r]
    self.Renew(l,right)
    self.Renew(r,left)


  #[x,y)の範囲の結果を取得
  def GetRange(self,x,y,k=0,l=0,r=-1):
    if r == -1:
      r = self.bitlen
    if y<=l or r<=x:
      return self.inf
    elif x<=l and r<=y:
      return self.arr[k]
    else:
      return self.order(
        self.GetRange(x,y,2*k+1,l,(l+r)//2),
        self.GetRange(x,y,2*k+2,(l+r)//2,r)
        )
  def nibtan(self,x,min_left=0,max_right=-1):
    if max_right == -1:
      max_right = self.len
    k = 0
    l,r = 0,self.bitlen
    while k < self.bitlen-1:
      left,right = self.arr[k*2+1],self.arr[k*2+2]
      c = (l+r)//2
      if c <= min_left:
        l = c
        k = 2*k+2
      elif c >= max_right:
        r = c
        k = 2*k+1
      else:
        if left<right:
          r = c
          k = 2*k+1
        else:
          l = c
          k = 2*k+2
    return k - self.bitlen+1


n,q = mi()
a = lmi()
segtree = SegTree(n,INF,min,a)
for _ in range(q):
  query,l,r = mi()
  if query == 1:
    segtree.Swap(l-1,r-1)
  else:
    print(segtree.nibtan(-1,l-1,r)+1)
0