結果
問題 | No.1705 Mode of long array |
ユーザー |
|
提出日時 | 2025-04-02 22:36:44 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 537 ms / 3,000 ms |
コード長 | 1,328 bytes |
コンパイル時間 | 400 ms |
コンパイル使用メモリ | 82,768 KB |
実行使用メモリ | 117,820 KB |
最終ジャッジ日時 | 2025-04-02 22:37:06 |
合計ジャッジ時間 | 21,521 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 51 |
ソースコード
N,M = map(int,input().split()) k = 0 while 2**k<M: k += 1 K = 2**k # ノード数 T = [[0,0] for _ in range(2*K)] for i in range(1,M+1): T[i+K-1][1] = i A = list(map(int,input().split())) def update(i,x): # 更新 i += K-1 T[i] = [T[i][0]+x,T[i][1]] i = i//2 while i>0: if T[2*i][0]<=T[2*i+1][0]: T[i] = T[2*i+1] else: T[i] = T[2*i] i //= 2 def find(l,r): # 区間最大値 l += K-1 # 左側の頂点 r += K-1 # 右側の頂点 res = [0,0] while l<r: if l&1: # 右子の場合 if res[0]<T[l][0]: res = T[l] elif res[0]==T[l][0] and T[l][1]>res[1]: res = T[l] l += 1 # 右隣の頂点に移る if r&1: # &0としたいところだが、この操作は意味ない r -= 1 # 左隣の頂点に移る if res[0]<T[r][0]: res = T[r] elif res[0]==T[r][0] and T[r][1]>res[1]: res = T[r] l >>= 1 # 親に移る r >>= 1 # 親に移る return res for i in range(M): update(i+1,A[i]) Q = int(input()) for _ in range(Q): t,x,y = map(int,input().split()) if t==1: update(x,y) elif t==2: update(x,-y) else: print(find(1,M+1)[1])