結果
問題 | No.1234 典型RMQ |
ユーザー |
![]() |
提出日時 | 2020-09-18 22:27:16 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 390 ms / 2,000 ms |
コード長 | 2,985 bytes |
コンパイル時間 | 177 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 94,464 KB |
最終ジャッジ日時 | 2024-11-09 01:58:24 |
合計ジャッジ時間 | 9,915 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 |
ソースコード
import sysinput = sys.stdin.readlineN=int(input())A=list(map(int,input().split()))# 非再帰遅延伝搬セグ木(範囲加算, 範囲最小値出力)# 高々N点を更新seg_el=1<<(N.bit_length()) # Segment treeの台の要素数SEG=[1<<60]*(2*seg_el) # 1-indexedなので、要素数2*seg_el.Segment treeの初期値で初期化for i in range(N): # Aを対応する箇所へupdateSEG[i+seg_el]=A[i]for i in range(seg_el-1,0,-1): # 親の部分もupdateSEG[i]=min(SEG[i*2],SEG[i*2+1])LAZY=[0]*(2*seg_el) # 1-indexedなので、要素数2*seg_el.Segment treeの初期値で初期化def indexes(L,R): # 遅延伝搬すべきノードのリストを下から上の順に返す. (つまり, updateやgetvaluesで見るノードより上にあるノードたち)INDLIST=[]R-=1L>>=1R>>=1while L!=R:if L>R:INDLIST.append(L)L>>=1else:INDLIST.append(R)R>>=1while L!=0:INDLIST.append(L)L>>=1return INDLISTdef adds(l,r,x): # 区間[l,r)を +x 更新L=l+seg_elR=r+seg_elL//=(L & (-L))R//=(R & (-R))UPIND=indexes(L,R)for ind in UPIND[::-1]: # 遅延伝搬. 上から更新していく. (ただし, 今回はうまくやるとこの部分を省ける. addはクエリの順番によらないので.addではなく, updateの場合必要)if LAZY[ind]!=0:plus_lazy=LAZY[ind]SEG[ind<<1]+=plus_lazySEG[1+(ind<<1)]+=plus_lazyLAZY[ind<<1]+=plus_lazyLAZY[1+(ind<<1)]+=plus_lazyLAZY[ind]=0while L!=R:if L > R:SEG[L]+=xLAZY[L]+=xL+=1L//=(L & (-L))else:R-=1SEG[R]+=xLAZY[R]+=xR//=(R & (-R))for ind in UPIND:SEG[ind]=min(SEG[ind<<1],SEG[1+(ind<<1)]) # 最初の遅延伝搬を省いた場合, ここを変えるdef getvalues(l,r): # 区間[l,r)に関するminを調べるL=l+seg_elR=r+seg_elL//=(L & (-L))R//=(R & (-R))UPIND=indexes(L,R)for ind in UPIND[::-1]: # 遅延伝搬if LAZY[ind]!=0:plus_lazy=LAZY[ind]SEG[ind<<1]+=plus_lazySEG[1+(ind<<1)]+=plus_lazyLAZY[ind<<1]+=plus_lazyLAZY[1+(ind<<1)]+=plus_lazyLAZY[ind]=0ANS=1<<60while L!=R:if L > R:ANS=min(ANS , SEG[L])L+=1L//=(L & (-L))else:R-=1ANS=min(ANS , SEG[R])R//=(R & (-R))return ANSQ=int(input())for queries in range(Q):k,l,r,c=map(int,input().split())if k==1:adds(l-1,r,c)else:print(getvalues(l-1,r))