結果
問題 | No.1234 典型RMQ |
ユーザー |
|
提出日時 | 2020-09-18 22:46:07 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 734 ms / 2,000 ms |
コード長 | 1,484 bytes |
コンパイル時間 | 337 ms |
コンパイル使用メモリ | 82,560 KB |
実行使用メモリ | 95,616 KB |
最終ジャッジ日時 | 2024-11-09 02:00:45 |
合計ジャッジ時間 | 16,567 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
# N: 処理する区間の長さN = int(input())INF = float('inf')LV = (N-1).bit_length()N0 = 2**LVdata = [0]*(2*N0)lazy = [0]*(2*N0)def gindex(l, r):L = (l + N0) >> 1; R = (r + N0) >> 1lc = 0 if l & 1 else (L & -L).bit_length()rc = 0 if r & 1 else (R & -R).bit_length()for i in range(LV):if rc <= i:yield Rif L < R and lc <= i:yield LL >>= 1; R >>= 1# 遅延伝搬処理def propagates(*ids):for i in reversed(ids):v = lazy[i-1]if not v:continuelazy[2*i-1] += v; lazy[2*i] += vdata[2*i-1] += v; data[2*i] += vlazy[i-1] = 0# 区間[l, r)にxを加算def update(l, r, x):*ids, = gindex(l, r)propagates(*ids)L = N0 + l; R = N0 + rwhile L < R:if R & 1:R -= 1lazy[R-1] += x; data[R-1] += xif L & 1:lazy[L-1] += x; data[L-1] += xL += 1L >>= 1; R >>= 1for i in ids:data[i-1] = min(data[2*i-1], data[2*i])# 区間[l, r)内の最小値を求めるdef query(l, r):propagates(*gindex(l, r))L = N0 + l; R = N0 + rs = INFwhile L < R:if R & 1:R -= 1s = min(s, data[R-1])if L & 1:s = min(s, data[L-1])L += 1L >>= 1; R >>= 1return sA = list(map(int, input().split()))for i in range(N):update(i,i+1,A[i])Q = int(input())ans = []for _ in range(Q):k,l,r,c = map(int, input().split())if k==1:update(l-1,r,c)else:ans.append(query(l-1,r))print(*ans, sep='\n')