Author: lllyouo
Date: 20251014
tag: 线段树
link: https://www.acwing.com/problem/content/246/问题描述
分析
略
参考代码
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
struct SegmentTree {
int l, r;
int tmax, lmax, rmax, sum;
} t[4 * N];
int a[N], n, m;
void pushup(SegmentTree& p, SegmentTree& l, SegmentTree& r) {
p.sum = l.sum + r.sum;
p.lmax = max(l.lmax, l.sum + r.lmax);
p.rmax = max(r.rmax, r.sum + l.rmax);
p.tmax = max(max(l.tmax, r.tmax), l.rmax + r.lmax);
}
void pushup(int p) {
pushup(t[p], t[p << 1], t[p << 1 | 1]);
}
void build(int p, int l, int r) {
t[p].l = l, t[p].r = r;
if (l == r) {
t[p].tmax = t[p].sum = t[p].lmax = t[p].rmax = a[l];
return;
}
int mid = (l + r) >> 1;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
pushup(p);
}
void modify(int p, int x, int v) {
if (t[p].l == x && t[p].r == x) {
t[p].tmax = t[p].sum = t[p].lmax = t[p].rmax = v;
return;
}
int mid = (t[p].l + t[p].r) >> 1;
if (x <= mid) modify(p << 1, x, v);
else modify(p << 1 | 1, x, v);
pushup(p);
}
SegmentTree query(int p, int l, int r) {
if (t[p].l >= l && t[p].r <= r) return t[p];
int mid = (t[p].l + t[p].r) >> 1;
// 注意
if (r <= mid) return query(p << 1, l, r);
if (l > mid) return query(p << 1 | 1, l, r);
else {
auto left = query(p << 1, l, r);
auto right = query(p << 1 | 1, l, r);
SegmentTree temp;
pushup(temp, left, right);
return temp;
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
while (m --) {
int k, x, y; cin >> k >> x >> y;
if (k == 1) {
if (x > y) swap(x, y);
cout << query(1, x, y).tmax << endl;
} else {
modify(1, x, y);
}
}
return 0;
}