社区讨论
秋条,8pts。
P4513小白逛公园参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m3fq569j
- 此快照首次捕获于
- 2024/11/13 18:14 去年
- 此快照最后确认于
- 2025/11/04 14:49 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
const int N=5e5+5;
int op,x,y;
int a[N];
int treel[N<<2],treer[N<<2],treemax[N<<2],tree[N<<2];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
struct node
{
int sum,l,r,max;
};
void push_up(int p)
{
treemax[p]=treel[rs(p)]+treer[ls(p)];
treemax[p]=max(treemax[p],max(treemax[ls(p)],treemax[rs(p)]));
tree[p]=tree[ls(p)]+tree[rs(p)];
treel[p]=max(treel[ls(p)],tree[ls(p)]+treel[rs(p)]);
treer[p]=max(treer[rs(p)],tree[rs(p)]+treer[ls(p)]);
}
void build(int s,int t,int p)
{
if(s==t)
{
treel[p]=treer[p]=tree[p]=treemax[p]=a[s];
return;
}
int mid=s+((t-s)>>1);
build(s,mid,ls(p));
build(mid+1,t,rs(p));
push_up(p);
}
void update(int x,int k,int s,int t,int p)
{
if(s==t)
{
treel[p]=treer[p]=tree[p]=treemax[p]=k;
return;
}
int mid=s+((t-s)>>1);
if(x<=mid) update(x,k,s,mid,ls(p));
else update(s,k,mid+1,t,rs(p));
push_up(p);
}
node query(int l,int r,int s,int t,int p)
{
if(l<=s and t<=r) return (node){tree[p],treel[p],treer[p],treemax[p]};
int mid=s+((t-s)>>1);
node ansl={(int)-1e9,(int)-1e9,(int)-1e9,(int)-1e9},ansr={(int)-1e9,(int)-1e9,(int)-1e9,(int)-1e9},ans;
if(l<=mid) ansl=query(l,r,s,mid,ls(p));
if(mid+1<=r) ansr=query(l,r,mid+1,t,rs(p));
ans.max=max(ansl.r+ansr.l,max(ansl.max,ansr.max));
ans.sum=ansl.sum+ansr.sum;
ans.l=max(ansl.l,ansl.sum+ansr.l);
ans.r=max(ansr.r,ansr.sum+ansl.r);
return ans;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
while(m--)
{
cin>>op>>x>>y;
if(op==1) cout<<query(min(x,y),max(x,y),1,n,1).max<<'\n';
else update(x,y,1,n,1);
//for(int i=1;i<=n*4;i++) cout<<treemax[i]<<' ';
//cout<<'\n';
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...