线段树求条
查看原帖
线段树求条
1646296
Genshin_ht楼主2025/7/23 10:13
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 10000005, SZ = N, INF = 0x7fffffff;

int n, q;
int a[1000005];
struct Node
{
    int l, r;
    int maxn;
    int set_lazy = INF;
    int add_lazy = 0;
} tree[SZ];

void pushdown(int u)
{
    if (tree[u].set_lazy != INF)
    {
        tree[u * 2].maxn = tree[u].set_lazy;
        tree[u * 2].set_lazy = tree[u].set_lazy;
        tree[u * 2].add_lazy = 0;
        tree[u * 2 + 1].maxn = tree[u].set_lazy;
        tree[u * 2 + 1].set_lazy = tree[u].set_lazy;
        tree[u * 2 + 1].add_lazy = 0;
        tree[u].set_lazy = INF;
    }
    if (tree[u].add_lazy != 0)
    {
        tree[u * 2].maxn += tree[u].add_lazy;
        tree[u * 2].add_lazy += tree[u].add_lazy;
        tree[u * 2 + 1].maxn += tree[u].add_lazy;
        tree[u * 2 + 1].add_lazy += tree[u].add_lazy;
        tree[u].add_lazy = 0;
    }
}

void build(int u = 1, int l = 1, int r = n)
{
    tree[u].l = l;
    tree[u].r = r;
    if (l == r)
    {
        tree[u].maxn = a[l];
        return;
    }
    int mid = (l + r) / 2;
    build(u * 2, l, mid);
    build(u * 2 + 1, mid + 1, r);
    tree[u].maxn = max(tree[u * 2].maxn, tree[u * 2 + 1].maxn);
}

void change(int L, int R, int x, int u = 1)
{
    int l = tree[u].l, r = tree[u].r;
    if (R < l || L > r)
        return;
    if (L <= l && r <= R)
    {
        tree[u].maxn = x;
        tree[u].set_lazy = x;
        tree[u].add_lazy = 0;
        return;
    }
    pushdown(u);
    change(L, R, x, u * 2);
    change(L, R, x, u * 2 + 1);
    tree[u].maxn = max(tree[u * 2].maxn, tree[u * 2 + 1].maxn);
}

void add(int L, int R, int x, int u = 1)
{
    int l = tree[u].l, r = tree[u].r;
    if (R < l || L > r)
        return;
    if (L <= l && r <= R)
    {
        tree[u].maxn += x;
        tree[u].add_lazy += x;
        return;
    }
    pushdown(u);
    add(L, R, x, u * 2);
    add(L, R, x, u * 2 + 1);
    tree[u].maxn = max(tree[u * 2].maxn, tree[u * 2 + 1].maxn);
}

int qmax(int L, int R, int u = 1)
{
    int l = tree[u].l, r = tree[u].r;
    if (R < l || L > r)
        return -INF;
    if (L <= l && r <= R)
        return tree[u].maxn;
    pushdown(u);
    return max(qmax(L, R, u * 2), qmax(L, R, u * 2 + 1));
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> q;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    build();
    while (q--)
    {
        int op, l, r, x;
        cin >> op;
        if (op == 1)
        {
            cin >> l >> r >> x;
            change(l, r, x);
        }
        else if (op == 2)
        {
            cin >> l >> r >> x;
            add(l, r, x);
        }
        else if (op == 3)
        {
            cin >> l >> r;
            cout << qmax(l, r) << '\n';
        }
    }
    return 0;
}

5050 pts

2025/7/23 10:13
加载中...