結果
| 問題 |
No.631 Noelちゃんと電車旅行
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-12-26 20:38:04 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 399 ms / 2,000 ms |
| コード長 | 2,405 bytes |
| コンパイル時間 | 1,961 ms |
| コンパイル使用メモリ | 174,404 KB |
| 実行使用メモリ | 8,832 KB |
| 最終ジャッジ日時 | 2024-10-02 09:39:45 |
| 合計ジャッジ時間 | 8,098 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using i64 = long long int;
const int iINF = INT_MAX;
template <typename Monoid>
struct StarrySky {
using F = function<Monoid(Monoid, Monoid)>;
int size = 1;
vector<Monoid> node, lazy;
const F f;
const Monoid M1, M2;
StarrySky(vector<Monoid> vec, const F f, const Monoid &M1, const Monoid &M2)
: f(f), M1(M1), M2(M2) {
init((int)vec.size());
for(int i = 0; i < (int)vec.size(); i++) {
node[i + size - 1] = vec[i];
}
for(int i = size - 2; i >= 0; i--) {
node[i] = f(node[i * 2 + 1], node[i * 2 + 2]);
}
}
void init(int n) {
while(size < n) size <<= 1;
node.resize(size * 2, M1);
lazy.resize(size * 2, M2);
}
void lazyEvaluate(int i, int l, int r) {
if(lazy[i] == M2) return;
node[i] += lazy[i];
if(r - l > 1) {
lazy[i * 2 + 1] += lazy[i];
lazy[i * 2 + 2] += lazy[i];
}
lazy[i] = M2;
}
void update(int a, int b, Monoid &x, int i = 0, int l = 0, int r = -1) {
if(r < 0) r = size;
lazyEvaluate(i, l, r);
if(r <= a || b <= l) return;
if(a <= l && r <= b) {
lazy[i] += x;
lazyEvaluate(i, l, r);
} else {
update(a, b, x, i * 2 + 1, l, (l + r) / 2);
update(a, b, x, i * 2 + 2, (l + r) / 2, r);
node[i] = f(node[i * 2 + 1], node[i * 2 + 2]);
}
}
Monoid query(int a, int b, int i = 0, int l = 0, int r = -1) {
if(r < 0) r = size;
lazyEvaluate(i, l, r);
if(r <= a || b <= l) return M1;
if(a <= l && r <= b) return node[i];
Monoid xl = query(a, b, i * 2 + 1, l, (l + r) / 2);
Monoid xr = query(a, b, i * 2 + 2, (l + r) / 2, r);
return f(xl, xr);
}
};
int main() {
int n, m;
cin >> n;
n -= 1;
vector<i64> vec(n);
for(int i = 0; i < n; i++) {
cin >> vec[i];
vec[i] += 3 * (n - i);
}
StarrySky<i64> seg(vec, [] (i64 a, i64 b) { return max(a, b); }, 0, 0);
cin >> m;
for(int i = 0; i < m; i++) {
int l, r;
i64 d;
cin >> l >> r >> d;
l -= 1;
r -= 1;
seg.update(l, r + 1, d);
cout << seg.query(0, n + 1) << endl;
}
return 0;
}