社区讨论
RE and MLE
P4513小白逛公园参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjtd555
- 此快照首次捕获于
- 2025/11/04 08:11 4 个月前
- 此快照最后确认于
- 2025/11/04 08:11 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define root 1, 1, n
#define lson fa << 1, l, mid
#define rson fa << 1 | 1, mid + 1, r
const int N = 1e5 + 10;
int n, m;
struct node{
int maxn, suf, pre, sum;
node(){
maxn = suf = pre = sum = -1e9;
}
void init(int x){
maxn = sum = pre = suf = x;
}
}tree[N << 2];
int a[N];
node operator + (const node &l, const node &r){
node res;
res.sum = l.sum + r.sum;
res.maxn = max(l.maxn, max(r.maxn, l.suf + r.pre));
res.pre = max(l.pre, l.sum + r.pre);
res.suf = max(r.suf, r.sum + l.suf);
return res;
}
inline void push_up(int fa){
tree[fa] = tree[fa << 1] + tree[fa << 1 | 1];
}
inline void build(int fa, int l, int r){
if (l == r){
tree[fa].init(a[l]);
return;
}
int mid = l + r >> 1;
build(lson);
build(rson);
push_up(fa);
}
inline void modify(int fa, int l, int r, int p, int k){//P这个位置的数改为K
if (l == r){
tree[fa].init(k);
return;
}
int mid = l + r >> 1;
if (p <= mid) modify(lson, p, k);
else modify(rson, p, k);
push_up(fa);
}
inline node query(int fa, int l, int r, int ql, int qr){
if (ql <= l && qr >= r){
return tree[fa];
}
int mid = l + r >> 1;
if (ql <= mid){
if (mid < qr) return query(lson, ql, qr) + query(rson, ql, qr);
else return query(lson, ql, qr);
}
else return query(rson, ql, qr);
}
signed main(){
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build(root);
while (m--){
int opt, l, r;
cin >> opt >> l >> r;
if (opt == 1){
cout << query(root, l, r).maxn << "\n";
}
else{
modify(root, l, r);
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...