結果
| 問題 | 
                            No.631 Noelちゃんと電車旅行
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2022-02-01 09:53:17 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 705 ms / 2,000 ms | 
| コード長 | 2,796 bytes | 
| コンパイル時間 | 149 ms | 
| コンパイル使用メモリ | 82,048 KB | 
| 実行使用メモリ | 94,336 KB | 
| 最終ジャッジ日時 | 2024-06-11 09:07:39 | 
| 合計ジャッジ時間 | 12,191 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 21 | 
ソースコード
import sys
input = sys.stdin.buffer.readline
class LazySegTree:
    """
    https://tjkendev.github.io/procon-library/python/range_query/rmq_raq_segment_tree_lp.html より拝借し、一部改変しています。
    """
    __slots__ = ["N", "LV", "N0", "data", "lazy"]
    def __init__(self, N):
        # N: 処理する区間の長さ
        self.N = N
        self.LV = (self.N - 1).bit_length()
        self.N0 = 2 ** self.LV
        self.data = [0] * (2 * self.N0)
        self.lazy = [0] * (2 * self.N0)
    # 初期化
    def initialize(self, A):
        for i in range(self.N):
            self.data[self.N0 - 1 + i] = A[i]
        for i in range(self.N0 - 2, -1, -1):
            self.data[i] = max(self.data[2 * i + 1], self.data[2 * i + 2])
    def gindex(self, l, r):
        L = (l + self.N0) >> 1
        R = (r + self.N0) >> 1
        lc = 0 if l & 1 else (L & -L).bit_length()
        rc = 0 if r & 1 else (R & -R).bit_length()
        for i in range(self.LV):
            if rc <= i:
                yield R
            if L < R and lc <= i:
                yield L
            L >>= 1
            R >>= 1
    # 遅延伝搬処理
    def propagates(self, *ids):
        for i in reversed(ids):
            v = self.lazy[i - 1]
            if not v:
                continue
            self.lazy[2 * i - 1] += v
            self.lazy[2 * i] += v
            self.data[2 * i - 1] += v
            self.data[2 * i] += v
            self.lazy[i - 1] = 0
    # 区間[l, r)にxを加算
    def update(self, l, r, x):
        *ids, = self.gindex(l, r)
        self.propagates(*ids)
        L = self.N0 + l
        R = self.N0 + r
        while L < R:
            if R & 1:
                R -= 1
                self.lazy[R - 1] += x
                self.data[R - 1] += x
            if L & 1:
                self.lazy[L - 1] += x
                self.data[L - 1] += x
                L += 1
            L >>= 1
            R >>= 1
        for i in ids:
            self.data[i - 1] = max(self.data[2 * i - 1], self.data[2 * i])
    # 区間[l, r)内の最大値を求める
    def query(self, l, r):
        self.propagates(*self.gindex(l, r))
        L = self.N0 + l
        R = self.N0 + r
        s = 0
        while L < R:
            if R & 1:
                R -= 1
                s = max(s, self.data[R - 1])
            if L & 1:
                s = max(s, self.data[L - 1])
                L += 1
            L >>= 1
            R >>= 1
        return s
N = int(input())
S = LazySegTree(N)
req_time = 3
T = map(int, input().split())
S.initialize([0] + [t - req_time * i for i, t in enumerate(T)])
M = int(input())
for _ in range(M):
    l, r, d = map(int, input().split())
    S.update(l, r + 1, d)
    print(S.query(1, N + 1) + req_time * (N - 1))