結果
問題 |
No.2942 Sigma Music Game Level Problem
|
ユーザー |
|
提出日時 | 2025-02-13 10:49:23 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 3,005 ms / 6,000 ms |
コード長 | 2,096 bytes |
コンパイル時間 | 218 ms |
コンパイル使用メモリ | 82,404 KB |
実行使用メモリ | 263,280 KB |
最終ジャッジ日時 | 2025-02-13 10:49:58 |
合計ジャッジ時間 | 32,478 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 |
ソースコード
# セグメント木(点更新、区間和):RSQ, BITでも実装可能 N,Q,L = map(int,input().split()) A = list(map(int,input().split())) K = 0 while 2**K<2*10**5: K += 1 M = 2**K # ノード数 T0 = [0]*(2*M) T1 = [0]*(2*M) R = [0]*(2*M) for i in range(M,2*M): # 0-origin R[i] = (i-M,i-M+1) for i in range(M-1,0,-1): l1,r1 = R[2*i] l2,r2 = R[2*i+1] R[i] = (l1,r2) def update0(i,x): # 1点更新 i += M # 頂点番号(0-origin) T0[i] += x i >>= 1 # 親に移る while i>0: T0[i] = T0[2*i]+T0[2*i+1] i >>= 1 # 親に移る def update1(i,x): # 1点更新 j = i i += M # 頂点番号(0-origin) T1[i] += x*j i >>= 1 # 親に移る while i>0: T1[i] = T1[2*i]+T1[2*i+1] i >>= 1 # 親に移る def find0(l,r): # 区間取得 l += M # 頂点番号(0-origin) r += M # 頂点番号(0-origin) result = 0 while l<r: if l&1: # lが奇数の場合(右の子) result += T0[l] l += 1 # 右隣に移動 if r&1: # rが奇数の場合(右の子) r -= 1 # 左隣に移動 result += T0[r] l >>= 1 # 親に移動 r >>= 1 # 親に移動 return result def find1(l,r): # 区間取得 l += M # 頂点番号(0-origin) r += M # 頂点番号(0-origin) result = 0 while l<r: if l&1: # lが奇数の場合(右の子) result += T1[l] l += 1 # 右隣に移動 if r&1: # rが奇数の場合(右の子) r -= 1 # 左隣に移動 result += T1[r] l >>= 1 # 親に移動 r >>= 1 # 親に移動 return result for i in range(N): update0(A[i],1) update1(A[i],1) flag = True for _ in range(Q): qry = list(map(int,input().split())) if qry[0]==1: a = qry[1] update0(a,1) update1(a,1) elif qry[0]==2: flag = False l,r = qry[1:] r += 1 print(find0(l,r),find1(l,r)) else: L = qry[1] if flag: print("Not Found!")