Submission #1181903

#TimeUsernameProblemLanguageResultExecution timeMemory
1181903mehmetkaganProgression (NOI20_progression)C++20
0 / 100
3097 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll

const int N = 3e5 + 5;
int a[N], d[N];

struct Node {
    int l, r, len;
    int lval, rval;
    int lrun, rrun, mrun;
    Node *left, *right;

    Node(int l, int r): l(l), r(r), len(r - l + 1), left(nullptr), right(nullptr) {
        lval = rval = lrun = rrun = mrun = 0;
    }

    void merge() {
        lval = left->lval;
        rval = right->rval;
        lrun = left->lrun;
        rrun = right->rrun;
        mrun = max(left->mrun, right->mrun);
        if (left->rval == right->lval) {
            if (left->lrun == left->len) lrun += right->lrun;
            if (right->rrun == right->len) rrun += left->rrun;
            mrun = max(mrun, left->rrun + right->lrun);
        }
    }
};

Node* build(int l, int r) {
    Node* node = new Node(l, r);
    if (l == r) {
        node->lval = node->rval = d[l];
        node->lrun = node->rrun = node->mrun = 1;
        return node;
    }
    int m = (l + r) / 2;
    node->left = build(l, m);
    node->right = build(m + 1, r);
    node->merge();
    return node;
}

void point_update(Node* node, int pos, int val) {
    if (node->l == node->r) {
        node->lval = node->rval = val;
        node->lrun = node->rrun = node->mrun = 1;
        return;
    }
    int m = (node->l + node->r) / 2;
    if (pos <= m) point_update(node->left, pos, val);
    else point_update(node->right, pos, val);
    node->merge();
}

Node query(Node* node, int l, int r) {
    if (l <= node->l && node->r <= r) return *node;
    int m = (node->l + node->r) / 2;
    if (r <= m) return query(node->left, l, r);
    if (l > m) return query(node->right, l, r);
    Node res(0, 0);
    Node left = query(node->left, l, r);
    Node right = query(node->right, l, r);
    res.left = &left;
    res.right = &right;
    res.len = left.len + right.len;
    res.merge();
    return res;
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i < n; i++) d[i] = a[i + 1] - a[i];
    Node* root = build(1, n - 1);

    while (q--) {
        int t;
        cin >> t;
        if (t == 1 || t == 2) {
            int l, r, s, c;
            cin >> l >> r >> s >> c;
            for (int i = l; i <= r; i++) {
                int val = s + (i - l) * c;
                if (t == 1) a[i] += val;
                else a[i] = val;
            }
            for (int i = max(1LL, l - 1); i <= min(n - 1, r); i++) {
                d[i] = a[i + 1] - a[i];
                point_update(root, i, d[i]);
            }
        } else {
            int l, r;
            cin >> l >> r;
            if (l == r) cout << 1 << '\n';
            else cout << query(root, l, r - 1).mrun + 1 << '\n';
        }
    }

    return 0;
}
#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...