結果
| 問題 | No.631 Noelちゃんと電車旅行 | 
| コンテスト | |
| ユーザー |  Ryu | 
| 提出日時 | 2018-07-02 18:02:31 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 280 ms / 2,000 ms | 
| コード長 | 3,085 bytes | 
| コンパイル時間 | 1,152 ms | 
| コンパイル使用メモリ | 93,488 KB | 
| 実行使用メモリ | 11,264 KB | 
| 最終ジャッジ日時 | 2024-10-02 09:37:40 | 
| 合計ジャッジ時間 | 6,359 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 21 | 
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <string>
#include <cmath>
#include <map>
#include <cstring>
#include <queue>
#define REP(i, n) for (int i = 0; i < (n); i++)
#define FOR(i, init, n) for (int i = init; i < (n); i++)
#define ALL(obj) (obj).begin(), (obj).end()
#define RALL(obj) (obj).rbegin(), (obj).rend()
#define Cout(obj) cout << obj << endl
#define Size(obj) (int)(obj).size()
#define fcout cout << fixed << setprecision(10)
#define fi first
#define se second
using namespace std;
using ll = long long int;
using P = pair<int, int>;
using T = tuple<int, int, int>;
using edge = struct
{
    int to, cost;
};
const int MOD = 1e9 + 7;
const int iINF = 1e9;
const long long int llINF = 1e18;
const double PI = acos(-1.0);
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
template <typename T>
struct LazzySegTreeMax
{
  private:
    ll N = 1;
    vector<T> node, lazy;
  public:
    LazzySegTreeMax(vector<T> vec)
    {
        ll size = Size(vec);
        while (N < size)
        {
            N *= 2;
        }
        node.resize(2 * N - 1);
        lazy.resize(2 * N - 1, 0);
        REP(i, size)
        {
            node[i + N - 1] = vec[i] + (size - i) * 3;
        }
        for (int i = N - 2; 0 <= i; i--)
        {
            node[i] = max(node[2 * i + 1], node[2 * i + 2]);
        }
    }
    void eval(int k, int l, int r)
    {
        if (lazy[k] != 0)
        {
            node[k] += lazy[k];
            if (r - l > 1)
            {
                lazy[2 * k + 1] += lazy[k];
                lazy[2 * k + 2] += lazy[k];
            }
            lazy[k] = 0;
        }
    }
    void add(int a, int b, T value, int k = 0, int l = 0, int r = -1)
    {
        if (r < 0)
            r = N;
        eval(k, l, r);
        if (r <= a || b <= l)
            return;
        if (a <= l && r <= b)
        {
            lazy[k] += value;
            eval(k, l, r);
        }
        else
        {
            add(a, b, value, 2 * k + 1, l, (l + r) / 2);
            add(a, b, value, 2 * k + 2, (l + r) / 2, r);
            node[k] = max(node[2 * k + 1], node[2 * k + 2]);
        }
    }
    T getMax(int a, int b, int k = 0, int l = 0, int r = -1)
    {
        if (r < 0)
        {
            r = N;
        }
        eval(k, l, r);
        if (r <= a || b <= l)
        {
            return -iINF;
        }
        if (a <= l && r <= b)
        {
            return node[k];
        }
        T vl = getMax(a, b, 2 * k + 1, l, (l + r) / 2);
        T vr = getMax(a, b, 2 * k + 2, (l + r) / 2, r);
        return max(vl, vr);
    }
};
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    int N;
    cin >> N;
    vector<ll> T(N - 1);
    REP(i, N - 1)
    {
        cin >> T[i];
    }
    int M;
    cin >> M;
    vector<ll> L(M), R(M), D(M);
    REP(i, M)
    {
        cin >> L[i] >> R[i] >> D[i];
    }
    LazzySegTreeMax<ll> seg(T);
    REP(i, M)
    {
        seg.add(L[i] - 1, R[i], D[i]);
        Cout(seg.getMax(0, N));
    }
    return 0;
}
            
            
            
        