P1253扶苏的问题,求调50pts

P1253 扶苏的问题

Wangbingxiang @ 2024-09-20 21:38:50

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int a[maxn + 2];
struct tree {
    int l, r, tag;
    long long pre, add, co;
} t[4 * maxn + 2];
void bulid(int p, int l, int r) {
    t[p].l = l;
    t[p].r = r;
    if (l == r) {
        t[p].pre = a[l];
        return;
    }
    int mid = (l+r) >> 1;
    bulid(p * 2, l, mid);
    bulid(p * 2 + 1, mid + 1, r);
    t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
void cover(int p) {
    if (t[p].tag) {
        t[p * 2].pre = t[p * 2 + 1].pre = t[p].co;
        t[p * 2].co = t[p * 2 + 1].co = t[p].co;
        t[p * 2].tag = t[p * 2 + 1].tag = 1;
        t[p].co = 0;
        t[p].tag = 0;
    }
}
void spread(int p) {
    if (t[p].add) {
        t[p * 2].pre += t[p].add;
        t[p * 2 + 1].pre += t[p].add;
        t[p * 2].add += t[p].add;
        t[p * 2 + 1].add += t[p].add;

        t[p].add = 0;
    }
}
void change1(int p, int x, int y, int z) {
    if (x <= t[p].l && y >= t[p].r) {
        t[p].pre += (long long)z;
        t[p].add += z;
        return;
    }
    spread(p);
    int mid = (t[p].l+t[p].r) >> 1;
    if (x <= mid) change1(p * 2, x, y, z);
    if (y > mid) change1(p * 2 + 1, x, y, z);
    t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
void change2(int p, int x, int y, int z) {
    if (x <= t[p].l && y >= t[p].r) {
        t[p].pre = (long long)z;
        t[p].co = z;
        t[p].tag = 1;
        return;
    }
    cover(p);
    int mid = (t[p].l+t[p].r) >> 1;
    if (x <= mid) change2(p * 2, x, y, z);
    if (y > mid) change2(p * 2 + 1, x, y, z);
    t[p].pre = max(t[p * 2].pre , t[p * 2 + 1].pre);
}
long long ask(int p, int x, int y) {
    if (x <= t[p].l && y >= t[p].r) return t[p].pre;
    spread(p);
    cover(p);
    int mid = (t[p].l+t[p].r) >> 1;
    long long ans = 0;
    if (x <= mid) ans = max(ask(p * 2, x, y),ans);
    if (y > mid) ans = max(ask(p * 2 + 1, x, y),ans);
    return ans;
}

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    bulid(1, 1, n);
    for (int i = 1; i <= m; i++) {
        int q, x, y, z;
        scanf("%d", &q);
        if (q == 2) {
            scanf("%d%d%d", &x, &y, &z);
            change1(1, x, y, z);
        } else if (q == 1) {
            scanf("%d%d%d", &x, &y, &z);
            change2(1, x, y, z);
        } else if (q == 3) {
            scanf("%d%d", &x, &y);
            cout << ask(1, x, y) << endl;
        }
    }
    return 0;
}

|