社区讨论
60tps求调,玄关
P1253扶苏的问题参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m01ux516
- 此快照首次捕获于
- 2024/08/20 11:20 2 年前
- 此快照最后确认于
- 2024/08/20 13:54 2 年前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+22;
void re(int &x){scanf("%lld",&x);}
void wr(int x){printf("%lld ",x);}
void cre(char ccc[]){scanf("%s",ccc+1);}
void cwr(char ccc[]){printf("%s",ccc+1);}
void enter(){putchar('\n');}
struct SegNode{
int plu1,plu2,Sum,f;
};int SIGN=-1e18;
class SegTree{
#define mid ((l+r)>>1)
#define ls (x<<1)
#define rs (x<<1|1)
public:
SegNode tree[(N<<2)+22];
inline void pushupSum(int x){
tree[x].Sum=max(tree[ls].Sum,tree[rs].Sum);
}
inline void downSumPlus(int x,int l,int r){
tree[ls].plu1+=tree[x].plu1;
tree[ls].Sum+=tree[x].plu1;
tree[rs].plu1+=tree[x].plu1;
tree[rs].Sum+=tree[x].plu1;
tree[x].plu1=0;
}
inline void downSumEqual(int x,int l,int r){
tree[ls].plu2=tree[x].plu2;
tree[ls].Sum=tree[x].plu2;
tree[ls].plu1=0;
tree[rs].plu2=tree[x].plu2;
tree[rs].Sum=tree[x].plu2;
tree[rs].plu1=0;
tree[x].f=0;
tree[x].plu2=SIGN;
tree[x].plu1=0;
}
inline void changeSumPlus(int x,int l,int r,int s,int t,int p){
if(s<=l && r<=t){
tree[x].Sum+=p;
tree[x].plu1+=p;
return ;
}
if(tree[x].plu1!=SIGN) downSumPlus(x,l,r);
if(s<=mid) changeSumPlus(ls,l,mid,s,t,p);
if(t>mid) changeSumPlus(rs,mid+1,r,s,t,p);
pushupSum(x);
}
inline void changeSumEqual(int x,int l,int r,int s,int t,int p){
if(s<=l && r<=t){
tree[x].Sum=p;
tree[x].f=1;
tree[x].plu2=p;
tree[x].plu1=0;
return ;
}
if(tree[x].f!=0) downSumEqual(x,l,r);
if(s<=mid) changeSumEqual(ls,l,mid,s,t,p);
if(t>mid) changeSumEqual(rs,mid+1,r,s,t,p);
pushupSum(x);
}
int SumQuery(int x,int l,int r,int s,int t){
if(s<=l && r<=t) return tree[x].Sum;
if(tree[x].f!=0) downSumEqual(x,l,r);
if(tree[x].plu1!=0) downSumPlus(x,l,r);
int ans=-1e18;
if(s<=mid) ans=max(ans,SumQuery(ls,l,mid,s,t));
if(t>mid) ans=max(ans,SumQuery(rs,mid+1,r,s,t));
return ans;
}
inline void build(int x,int l,int r,int awa[]){
if(l==r){
tree[x].Sum=awa[l];
return ;
}
build(ls,l,mid,awa);
build(rs,mid+1,r,awa);
pushupSum(x);
}
inline void SumEqual(int n,int l,int r,int p){return changeSumEqual(1,1,n,l,r,p);}
inline void SumPlus(int n,int l,int r,int p){return changeSumPlus(1,1,n,l,r,p);}
int SumQ(int n,int l,int r){return SumQuery(1,1,n,l,r);}
}STS;
int n,q,a[N];
signed main(){
re(n),re(q);
for(int i=1;i<=n;i++) re(a[i]);
STS.build(1,1,n,a);
while(q--){
int x,y,z;
re(x);
if(x==1){
re(x),re(y),re(z);
STS.SumEqual(n,x,y,z);
}else if(x==2){
re(x),re(y),re(z);
STS.SumPlus(n,x,y,z);
}else{
re(x),re(y);
wr(STS.SumQ(n,x,y));
enter();
}
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...