結果
問題 | No.875 Range Mindex Query |
ユーザー |
|
提出日時 | 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 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
import sysimport mathsys.setrecursionlimit(10**8)class segki():#modeで関数を選べます。(min,max,sum,prd(product),gcd,lmc,^,&,|)def __init__(self,N,ls,mode='min'): #葉の数N,要素lsself.mode = modeself.default = self.setdef()self.N = Nself.K = len(bin(self.N))-3if self.N%(2**(self.K)) != 0:self.K += 1self.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 << 60elif self.mode == 'max':return -(1 << 60)elif self.mode == 'sum':return 0elif self.mode == 'prd':return 1elif self.mode == 'gcd':return 0elif self.mode == 'lmc':return 1elif self.mode == '^':return 0elif self.mode == '&':return (1 << 60)-1elif self.mode == '|':return 0def 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+yelif self.mode == 'prd': return x*yelif self.mode == 'gcd': return math.gcd(x,y)elif self.mode == 'lmc': return (x*y)//math.gcd(x,y)elif self.mode == '^': return x^yelif self.mode == '&': return x&yelif self.mode == '|': return x|ydef leafvalue(self,x):return self.dat[x+2**self.K-1]def update(self,x,y): #index(x)をyに変更i = x+2**self.K-1self.dat[i] = ywhile (i>0): #親の値を変更i = (i-1)//2self.dat[i] = self.func(self.dat[2*i+1],self.dat[2*i+2])returndef 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.defaultif (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]] = ilsQ = []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-1lsaind[ar] = l-1else:print(lsaind[SG.query(l-1,r)]+1)