結果
問題 | No.631 Noelちゃんと電車旅行 |
ユーザー |
![]() |
提出日時 | 2024-07-07 04:00:50 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 518 ms / 2,000 ms |
コード長 | 2,839 bytes |
コンパイル時間 | 1,117 ms |
コンパイル使用メモリ | 82,244 KB |
実行使用メモリ | 93,888 KB |
最終ジャッジ日時 | 2024-07-07 04:01:03 |
合計ジャッジ時間 | 9,870 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 21 |
ソースコード
import sysinput = sys.stdin.readlineN=int(input())T=list(map(int,input().split()))# 非再帰遅延伝搬セグ木(範囲加算, 範囲最小値出力)# 高々N点を更新seg_el=1<<(N.bit_length()) # Segment treeの台の要素数SEG=[0]*(2*seg_el) # 1-indexedなので、要素数2*seg_el.Segment treeの初期値で初期化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]=max(SEG[ind<<1],SEG[1+(ind<<1)]) # 最初の遅延伝搬を省いた場合, ここを変えるdef getvalues(l,r): # 区間[l,r)に関するmaxを調べる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=0while L!=R:if L > R:ANS=max(ANS , SEG[L])L+=1L//=(L & (-L))else:R-=1ANS=max(ANS , SEG[R])R//=(R & (-R))return ANSfor i in range(N-1):adds(i,i+1,T[i]+(N-i-1)*3)Q=int(input())for tests in range(Q):l,r,plus=map(int,input().split())l-=1adds(l,r,plus)print(getvalues(0,N))