stmo @ 2024-01-17 14:42:17
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
const int N=4e6+10;
typedef long long LL;
int n;
int a[N];
struct node{
int l,r;
LL ma;
LL ad;
LL b;
bool f;
}tr[N];
void pushup(int u){
tr[u].ma=max(tr[u<<1].ma,tr[u<<1|1].ma);
}
void pushdown(int u){
if(tr[u].f){
int le=u<<1,ri=u<<1|1;
tr[le].ma=tr[u].b;
tr[le].ad=0;
tr[ri].ma=tr[u].b;
tr[ri].ad=0;
tr[ri].b=tr[u].b;
tr[le].b=tr[u].b;
tr[le].f=true;
tr[ri].f=true;
tr[u].f=false;
}
if(tr[u].ad){
int add=tr[u].ad;
tr[u].ad=0;
tr[u<<1].ad+=add;
tr[u<<1].ma+=add;
tr[u<<1|1].ad+=add;
tr[u<<1|1].ma+=add;
}
}
void build(int u,int l,int r){//先变后加
tr[u].l=l;tr[u].r=r;
tr[u].ad=0;//加
tr[u].b=0;//变
tr[u].f=false;//是否有变
if(l==r)tr[u].ma=a[l];
else{
int mid=(l+r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
}
void modi1(int u,int l ,int r,int k){//区间变为k
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].ma=k;
tr[u].f=true;
tr[u].b=k;
tr[u].ad=0;
}
else{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)modi1(u<<1,l,r,k);
if(r>mid)modi1(u<<1|1,l,r,k);
pushup(u);
}
}
void modi2(int u,int l,int r,int x){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].ma+=x;
tr[u].ad+=x;
}
else{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)modi2(u<<1,l,r,x);
if(r>mid)modi2(u<<1|1,l,r,x);
pushup(u);
}
}
LL ask(int u,int l,int r){
LL res=-21474836470000;
if(tr[u].l>=l&&tr[u].r<=r)return tr[u].ma;
else{
pushdown(u);
int mid=(tr[u].l+tr[u].r)>>1;
if(l<=mid)res=max(res,ask(u<<1,l,r));
if(r>mid)res=max(ask(u<<1|1,l,r),res);
return res;
}
}
int main(){
ios::sync_with_stdio(false);
LL m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int c;
cin>>c;
if(c==1){
LL l,r,x;
cin>>l>>r>>x;
modi1(1,l,r,x);
}
if(c==2){
LL l,r,x;
cin>>l>>r>>x;
modi2(1,l,r,x);
}
if(c==3){
LL l,r;cin>>l>>r;
cout<<ask(1,l,r)<<"\n";
}
}
return 0;
}
by 杜都督 @ 2024-01-30 04:46:53
50分基本都是long long的问题,你这个也是
你在绝大多数需要开LL的地方都写对了,唯独漏了1处
第41行,也就是pushdown的第二个if里,你用于缓存tr[u].ad的add是int的,改成LL就能100分
by stmo @ 2024-02-01 12:49:50
谢谢佬