제출 #1300118

#제출 시각아이디문제언어결과실행 시간메모리
1300118adaawfProgression (NOI20_progression)C++20
68 / 100
715 ms78148 KiB
#include <bits/stdc++.h>
using namespace std;
struct PROG {
    long long int x, y, a, b;
    int s, c, d, res;
} t[1200005];
long long int a[300005], lazy[1200005], lazy2[1200005], lazy3[1200005];
PROG Merge(PROG aa, PROG bb) {
    if (aa.s == 0) return bb;
    if (bb.s == 0) return aa;
    PROG res;
    res.x = aa.x; res.y = bb.y;
    res.s = aa.s + bb.s;
    res.a = aa.a; res.b = bb.b;
    if (aa.s == 1) res.a = bb.x - aa.y;
    else res.a = aa.a;
    if (bb.s == 1) res.b = bb.x - aa.y;
    else res.b = bb.b;
    if (res.s == 2) {
        res.res = res.c = res.d = 1;
        return res;
    }
    res.res = max(aa.res, bb.res);
    long long int h = bb.x - aa.y;
    int c = 1;
    if (h == aa.b) c += aa.d;
    if (h == bb.a) c += bb.c;
    //cout << aa.d << " " << bb.c << " " << c << '\n';
    res.res = max(res.res, c);
    if (aa.s == 1) res.c = c;
    else {
        res.c = aa.c;
        if (aa.c == aa.s - 1 && aa.a == h) {
            res.c++;
            if (bb.a == aa.a) {
                res.c += bb.c;
            }
        }
    }
    if (bb.s == 1) res.d = c;
    else {
        res.d = bb.d;
        if (bb.d == bb.s - 1 && bb.b == h) {
            res.d++;
            if (bb.b == aa.b) {
                res.d += aa.d;
            }
        }
    }
    return res;
}
void apply(int v, int tl, int tr, long long int x, long long int y, long long int z) {
    if (z >= -1e12) {
        t[v].x = t[v].y = z;
        t[v].a = t[v].b = 0;
        t[v].c = t[v].d = t[v].res = t[v].s - 1;
        lazy[v] = lazy2[v] = 0;
        lazy3[v] = x;
    }
    t[v].x += x + y * tl;
    t[v].y += x + y * tr;
    t[v].a += y;
    t[v].b += y;
    lazy[v] += x;
    lazy2[v] += y;
}
void push(int v, int tl, int tr) {
    int mid = (tl + tr) >> 1;
    apply(v << 1, tl, mid, lazy[v], lazy2[v], lazy3[v]);
    apply(v << 1 | 1, mid + 1, tr, lazy[v], lazy2[v], lazy3[v]);
    lazy3[v] = -1e18;
    lazy[v] = lazy2[v] = 0;
}
void update(int v, int tl, int tr, int l, int r, long long int x, long long int y) {
    if (l > r) return;
    if (tl == l && tr == r) {
        apply(v, tl, tr, x, y, -1e18);
        return;
    }
    push(v, tl, tr);
    int mid = (tl + tr) >> 1;
    update(v << 1, tl, mid, l, min(r, mid), x, y);
    update(v << 1 | 1, mid + 1, tr, max(l, mid + 1), r, x, y);
    t[v] = Merge(t[v << 1], t[v << 1 | 1]);
}
void update2(int v, int tl, int tr, int l, int r, long long int x, long long int y) {
    if (l > r) return;
    if (tl == l && tr == r) {
        t[v].s = r - l + 1;
        apply(v, tl, tr, 0, y, x);
        if (tl == tr) {
            t[v].a = t[v].b = 1e18;
        }
        return;
    }
    push(v, tl, tr);
    int mid = (tl + tr) >> 1;
    update2(v << 1, tl, mid, l, min(r, mid), x, y);
    update2(v << 1 | 1, mid + 1, tr, max(l, mid + 1), r, x, y);
    t[v] = Merge(t[v << 1], t[v << 1 | 1]);
    //PROG h = t[v];
    //cout << h.x << " " << h.y << " " << h.a << " " << h.b << " " << h.c << " " << h.d << " " << h.res << " " << tl << " " << tr << '\n';
}
PROG sum(int v, int tl, int tr, int l, int r) {
    if (l > r) return {0, 0, 0, 0, 0, 0, 0, 0};
    if (tl == l && tr == r) return t[v];
    push(v, tl, tr);
    int mid = (tl + tr) >> 1;
    PROG h = Merge(sum(v << 1, tl, mid, l, min(r, mid)), sum(v << 1 | 1, mid + 1, tr, max(l, mid + 1), r));
    return h;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        update2(1, 1, n, i, i, a[i], 0);
    }
    for (int jj = 0; jj < q; jj++) {
        long long int w, x, y, s, c;
        cin >> w >> x >> y;
        if (w == 1) {
            cin >> s >> c;
            update(1, 1, n, x, y, s - x * c, c);
        }
        else if (w == 2) {
            cin >> s >> c;
            update2(1, 1, n, x, y, s - x * c, c);
        }
        else {
            cout << sum(1, 1, n, x, y).res + 1 << '\n';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...