社区讨论
9ptsWA求调
P4513小白逛公园参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjcvnie
- 此快照首次捕获于
- 2025/11/04 00:29 4 个月前
- 此快照最后确认于
- 2025/11/04 00:29 4 个月前
CPP
#include<bits/stdc++.h>
#define lson (u<<1)
#define rson (u<<1|1)
#define mid ((l+r)>>1)
#define int long long
using namespace std;
const int maxn=5e5+5;
int n,m;
int a[maxn];
struct segtree{
struct treenode{
bool flag;
int l,r;
int sum,mxl,mxr,ans;
treenode operator +(const treenode &other)const{
if((!other.flag)&&(!flag))return {0,0,0,0,0,0,0};
if(!other.flag)return *this;
if(!flag)return other;
treenode ans;
ans.flag=true;
ans.l=l,ans.r=other.r;
ans.sum=sum+other.sum;
ans.mxl=max(mxl,sum+other.mxl);
ans.mxr=max(other.mxr,other.sum+mxr);
ans.ans=max({ans.mxl,ans.mxr,mxr+other.mxl});
return ans;
}
}tree[maxn<<2];
void pushup(int u){
tree[u]=tree[lson]+tree[rson];
}
void build(int u,int l,int r){
tree[u].l=l,tree[u].r=r,tree[u].flag=true;
if(l==r){
tree[u].sum=tree[u].mxl=tree[u].mxr=tree[u].ans=a[l];
return;
}
build(lson,l,mid);
build(rson,mid+1,r);
pushup(u);
}
treenode query(int u,int L,int R){
int l=tree[u].l,r=tree[u].r;
if(L>r||R<l)return {0,0,0,0,0,0,0};
if(L<=l&&r<=R)return tree[u];
return query(lson,L,R)+query(rson,L,R);
}
void update(int u,int x,int y){
int l=tree[u].l,r=tree[u].r;
if(r<x||l>x)return;
if(l==r){
tree[u].ans=tree[u].mxl=tree[u].mxr=tree[u].sum=y;
return;
}
update(lson,x,y);
update(rson,x,y);
pushup(u);
}
}seg;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
seg.build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==1){
int l,r;
cin>>l>>r;
if(l>r)swap(l,r);
cout<<seg.query(1,l,r).ans<<endl;
}else{
int x,y;
cin>>x>>y;
seg.update(1,x,y);
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...