Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <array>
- #include <iostream>
- using namespace std;
- #define int long long
- const int INF = 1e18 + 7;
- const int MAXN = 1e5;
- array<int, 4 * MAXN> seg, pref, suf, sum;
- array<int, 4 * MAXN> upd;
- void push(int x, int lx, int rx) {
- if (upd[x] == INF) {
- return;
- }
- if (rx - lx == 1) {
- return;
- }
- upd[2 * x + 1] = upd[x];
- upd[2 * x + 2] = upd[x];
- seg[x] = pref[x] = suf[x] = (upd[x] > 0? upd[x] * (rx - lx): 0);
- sum[x] = upd[x] * (rx - lx);
- upd[x] = INF;
- }
- void update(int x, int lx, int rx, int l, int r, int v) {
- push(x, lx, rx);
- if (rx <= l || lx >= r) {
- return;
- }
- if (lx >= l && rx <= r) {
- upd[x] = v;
- push(x, lx, rx);
- return;
- }
- int mid = (lx + rx) / 2;
- update(x * 2 + 1, lx, mid, l, r, v);
- update(x * 2 + 2, mid, rx, l, r, v);
- int left = 2 * x + 1, right = 2 * x + 2;
- seg[x] = max({seg[left], seg[right], suf[left] + pref[right]});
- pref[x] = max(pref[left], sum[left] + pref[right]);
- suf[x] = max(suf[right], suf[left] + sum[right]);
- sum[x] = sum[left] + sum[right];
- }
- void init() {
- fill(upd.begin(), upd.end(), INF);
- fill(seg.begin(), seg.end(), 0);
- fill(pref.begin(), pref.end(), 0);
- fill(suf.begin(), suf.end(), 0);
- fill(sum.begin(), sum.end(), 0);
- }
- signed main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- int n, m;
- cin >> n >> m;
- init();
- for (int i = 0; i < m; ++i) {
- int l, r, v;
- cin >> l >> r >> v;
- update(0, 0, n, l, r, v);
- // for (int i = 0; i < 20; ++i) {
- // cout << sum[i] << ' ';
- // }
- // cout << endl;
- cout << seg[0] << ' ' << pref[0] << ' ' << suf[0] << ' ' << sum[0] << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment