社区讨论
求助,9 分
P4513小白逛公园参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @ltmwrkj7
- 此快照首次捕获于
- 2024/03/11 20:17 2 年前
- 此快照最后确认于
- 2024/03/11 21:59 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
#define ll long long
#define ls(u) u<<1
#define rs(u) u<<1|1
int n,m;
int a[N],siz[4*N];
ll w[4*N],maxx[4*N],lftmax[4*N],rgtmax[4*N];
int p,s,k;
void pushup(int u){
siz[u]=siz[ls(u)]+siz[rs(u)];
w[u]=w[ls(u)]+w[rs(u)];
lftmax[u]=max(lftmax[ls(u)],lftmax[rs(u)]+w[ls(u)]);
rgtmax[u]=max(rgtmax[rs(u)],rgtmax[ls(u)]+w[rs(u)]);
maxx[u]=max({maxx[ls(u)],maxx[rs(u)],lftmax[rs(u)]+rgtmax[ls(u)]});
}
void build(int u,int l,int r){
if(l==r){
w[u]=maxx[u]=lftmax[u]=rgtmax[u]=a[l];
siz[u]=1;
return;
}
int mid=l+r>>1;
build(ls(u),l,mid);
build(rs(u),mid+1,r);
pushup(u);
}
void modify(int u,int l,int r,int pos,int p){
if(l==r&&r==pos){
w[u]=maxx[u]=lftmax[u]=rgtmax[u]=p;
}
else if(!(l>pos||r<pos)){
int mid=l+r>>1;
modify(ls(u),l,mid,pos,p);
modify(rs(u),mid+1,r,pos,p);
pushup(u);
}
}
ll qry(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return w[u];
}
ll ans=0ll;
int mid=l+r>>1;
if(L>mid){
return qry(rs(u),mid+1,r,L,R);
}
if(R<=mid){
return qry(ls(u),l,mid,L,R);
}
else{
return max(qry(rs(u),mid+1,r,L,R),qry(ls(u),l,mid,L,R));
}
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
cin>>k;
if(k==1){
cin>>p>>s;
if(p>s){
swap(p,s);
}
cout<<qry(1,1,n,p,s)<<"\n";
}
else{
cin>>p>>s;
modify(1,1,n,p,s);
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...