結果
問題 | No.875 Range Mindex Query |
ユーザー | kohei2019 |
提出日時 | 2020-12-16 02:18:10 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,060 ms / 2,000 ms |
コード長 | 2,839 bytes |
コンパイル時間 | 178 ms |
コンパイル使用メモリ | 82,532 KB |
実行使用メモリ | 121,456 KB |
最終ジャッジ日時 | 2024-09-20 04:23:31 |
合計ジャッジ時間 | 8,814 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 35 ms
54,636 KB |
testcase_01 | AC | 89 ms
75,912 KB |
testcase_02 | AC | 120 ms
77,988 KB |
testcase_03 | AC | 54 ms
64,008 KB |
testcase_04 | AC | 73 ms
75,656 KB |
testcase_05 | AC | 45 ms
61,480 KB |
testcase_06 | AC | 88 ms
76,272 KB |
testcase_07 | AC | 92 ms
76,680 KB |
testcase_08 | AC | 70 ms
75,852 KB |
testcase_09 | AC | 84 ms
76,132 KB |
testcase_10 | AC | 129 ms
77,876 KB |
testcase_11 | AC | 768 ms
114,828 KB |
testcase_12 | AC | 573 ms
108,216 KB |
testcase_13 | AC | 540 ms
102,384 KB |
testcase_14 | AC | 487 ms
101,248 KB |
testcase_15 | AC | 673 ms
111,832 KB |
testcase_16 | AC | 936 ms
117,088 KB |
testcase_17 | AC | 1,060 ms
121,456 KB |
testcase_18 | AC | 1,058 ms
119,992 KB |
ソースコード
import sys import math sys.setrecursionlimit(10**8) class segki(): #modeで関数を選べます。(min,max,sum,prd(product),gcd,lmc,^,&,|) def __init__(self,N,ls,mode='min'): #葉の数N,要素ls self.mode = mode self.default = self.setdef() self.N = N self.K = len(bin(self.N))-3 if self.N%(2**(self.K)) != 0: self.K += 1 self.dat = [self.default]*(2**(self.K+1)) for i in range(self.N): #葉の構築 self.dat[2**self.K-1+i] = ls[i] self.build() def setdef(self): if self.mode == 'min':return 1 << 60 elif self.mode == 'max':return -(1 << 60) elif self.mode == 'sum':return 0 elif self.mode == 'prd':return 1 elif self.mode == 'gcd':return 0 elif self.mode == 'lmc':return 1 elif self.mode == '^':return 0 elif self.mode == '&':return (1 << 60)-1 elif self.mode == '|':return 0 def build(self): for j in range(2**self.K-2,-1,-1): self.dat[j] = self.func(self.dat[2*j+1],self.dat[2*j+2]) #親が持つ条件 def func(self,x,y):#関数を指定 if self.mode == 'min': return min(x,y) elif self.mode == 'max': return max(x,y) elif self.mode == 'sum': return x+y elif self.mode == 'prd': return x*y elif self.mode == 'gcd': return math.gcd(x,y) elif self.mode == 'lmc': return (x*y)//math.gcd(x,y) elif self.mode == '^': return x^y elif self.mode == '&': return x&y elif self.mode == '|': return x|y def leafvalue(self,x): return self.dat[x+2**self.K-1] def update(self,x,y): #index(x)をyに変更 i = x+2**self.K-1 self.dat[i] = y while (i>0): #親の値を変更 i = (i-1)//2 self.dat[i] = self.func(self.dat[2*i+1],self.dat[2*i+2]) return def query(self,a,b): #区間a,bの処理 return self.query_sub(a,b,0,0,2**self.K) def query_sub(self,a,b,k,l,r): if r <= a or b <= l: return self.default if (a <= l and r <= b): return self.dat[k] else: vl = self.query_sub(a, b, k * 2 + 1, l, (l + r) // 2) vr = self.query_sub(a, b, k * 2 + 2, (l + r) // 2, r) return self.func(vl,vr) N,Q = map(int,input().split()) lsa = list(map(int,input().split())) lsaind = [0]*(N+1) for i in range(N): lsaind[lsa[i]] = i lsQ = [] for i in range(Q): lsQ.append(map(int,input().split())) SG = segki(N,lsa,mode='min') for i in range(Q): a,l,r = lsQ[i] if a == 1: al = SG.leafvalue(l-1) ar = SG.leafvalue(r-1) SG.update(l-1,ar) SG.update(r-1,al) lsaind[al] = r-1 lsaind[ar] = l-1 else: print(lsaind[SG.query(l-1,r)]+1)