結果
| 問題 |
No.2942 Sigma Music Game Level Problem
|
| コンテスト | |
| ユーザー |
PNJ
|
| 提出日時 | 2024-10-18 22:23:54 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 3,060 ms / 6,000 ms |
| コード長 | 2,471 bytes |
| コンパイル時間 | 425 ms |
| コンパイル使用メモリ | 82,312 KB |
| 実行使用メモリ | 248,088 KB |
| 最終ジャッジ日時 | 2024-11-15 18:39:08 |
| 合計ジャッジ時間 | 30,355 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 24 |
ソースコード
def add(x,y):
return x + y
class segtree():
def __init__(self,n,op,e):
self.n = n
self.size = 1 << ((n - 1).bit_length())
self.e = e
self.seg = [e for i in range(self.size << 1)]
self.op = op
def set(self,i,x):
j = i + self.size
self.seg[j] = x
j >>= 1
while j:
self.seg[j] = self.op(self.seg[j << 1],self.seg[(j << 1) ^ 1])
j >>= 1
return 0
def add(self,i,x):
self.set(i,self.get(i) + x)
return
def set_array(self,A):
for i in range(self.n):
self.set(i,A[i])
return
def get(self,i):
return self.seg[i + self.size]
def prod(self,l,r):
sml = self.e
smr = self.e
ll = l + self.size
rr = r + self.size
while ll < rr:
if ll & 1:
sml = self.op(sml,self.seg[ll])
ll += 1
if rr & 1:
smr = self.op(smr,self.seg[rr-1])
rr -= 1
ll >>= 1
rr >>= 1
return self.op(sml,smr)
def max_right(self,l,f):
if l == self.n:
return self.n
ll = l + self.size
sm = self.e
while True:
while ll % 2 == 0:
ll >>= 1
if not(f(self.op(sm,self.seg[ll]))):
while ll < self.size:
ll <<= 1
if f(self.op(sm,self.seg[ll])):
sm = self.op(sm,self.seg[ll])
ll += 1
return ll - self.size
sm = self.op(sm,self.seg[ll])
ll += 1
if (ll & -ll) == ll:
break
return self.n
def min_left(self,r,f):
if r == 0:
return 0
rr = r + self.size
sm = self.e
while True:
rr -= 1
while (rr > 1 and (rr % 2)):
rr >>= 1
if not(f(self.op(self.seg[rr],sm))):
while (rr < self.size):
rr = (rr << 1) + 1
if self.op(sm,self.seg[rr]):
sm = self.op(sm,self.seg[rr])
rr -= 1
return rr + 1 - self.size
sm = self.op(sm,self.seg[rr])
if (rr & -rr) == rr:
break
return 0
N,Q,L = map(int,input().split())
A = list(map(int,input().split()))
M = 200001
seg = segtree(M,add,0)
segg = segtree(M,add,0)
for a in A:
seg.set(a,seg.get(a) + 1)
segg.set(a,segg.get(a) + a)
f = 1
for _ in range(Q):
q = list(map(int,input().split()))
if q[0] == 1:
l = q[1]
seg.set(l,seg.get(l) + 1)
segg.set(l,segg.get(l) + l)
elif q[0] == 2:
f = 0
l,r = q[1],q[2]
print(seg.prod(l,r + 1),segg.prod(l,r + 1))
else:
m = q[1]
if f:
print('Not Found!')
PNJ