space_P @ 2024-11-24 20:38:01
#include<bits/stdc++.h>
#define endl '\n'
#define intmid int mid=(l+r)>>1
using namespace std;
const int N=1011111,mi=-1111111111;
int n,q,a[N];
int tr[N<<2]={0},lt[N<<2][3]={0};
int fr(){
int x=0,f=1;
char ch=getchar();
while(ch < '0' || ch > '9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch >='0' && ch <= '9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
int ls(int k){
return k<<1;
}
int rs(int k){
return (k<<1)|1;
}
void pu(int k){
tr[k]=tr[ls(k)] > tr[rs(k)] ? tr[ls(k)] : tr[rs(k)];
}
void pd(int k){
if(lt[k][0]){
tr[ls(k)]=lt[k][0];
lt[ls(k)][0]=lt[k][0];
lt[ls(k)][1]=0;
tr[rs(k)]=lt[k][0];
lt[rs(k)][0]=lt[k][0];
lt[rs(k)][1]=0;
lt[k][0]=mi;
return;
}
tr[ls(k)]+=lt[k][1];
lt[ls(k)][1]=lt[k][1];
tr[rs(k)]+=lt[k][1];
lt[rs(k)][1]=lt[k][1];
lt[k][1]=0;
}
void blind(int k,int l,int r){
lt[k][0]=mi;
lt[k][1]=0;
if(l==r){
tr[k]=a[l];
return;
}
intmid;
blind(ls(k),l,mid);
blind(rs(k),mid+1,r);
pu(k);
}
void ru(int k,int l,int r,int op,int ul,int ur,int x){
if(ul > r || ur < l) return;
pd(k);
if(op^1){
if(ul <= l && ur >= r){
lt[k][1]+=x;
}
intmid;
ru(ls(k),l,mid,op,ul,ur,x);
ru(rs(k),mid+1,r,op,ul,ur,x);
pu(k);
return;
}
if(ul <= l && ur >= r){
lt[k][0]=x;
}
intmid;
ru(ls(k),l,mid,op,ul,ur,x);
ru(rs(k),mid+1,r,op,ul,ur,x);
pu(k);
}
int rq(int k,int l,int r,int ql,int qr){
if(l > qr || r < ql) return mi;
pd(k);
if(l >= ql && r <= qr) return tr[k];
intmid;
return max(rq(ls(k),l,mid,ql,qr),rq(rs(k),mid+1,r,ql,qr));
}
int main(){
n=fr();q=fr();
for(int i=1;i<=n;i++){
a[i]=fr();
}
blind(1,1,n);
while(q--){
int op=fr();
if(op==3){
int ql=fr(),qr=fr();
cout<<rq(1,1,n,ql,qr);
putchar('\n');
}
else {
int ul=fr(),ur=fr(),x=fr();
ru(1,1,n,op,ul,ur,x);
}
}
return 0;
}
by INTP_A @ 2024-11-25 18:50:16
一眼顶针,没有return。
if(ul <= l && ur >= r){
lt[k][1]+=x;
}
if(ul <= l && ur >= r){
lt[k][0]=x;
}