10pts求调
查看原帖
10pts求调
466276
huangjinxiu楼主2024/4/7 21:02
#include<bits/stdc++.h>
#define LL long long
#define ls u<<1
#define rs u<<1|1
using namespace std;
const int N=4e5+5;
int a[N],n,m,op,x,y,z;
struct T{
	LL sum,lmx,rmx,mx,tag;
	int l,r,len,mid,numx,numl,numr;
}t[N*4],g;
int read(){
	int k=0,f=1;char c=getchar();
	while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') k=(k<<3)+(k<<1)+(c^48),c=getchar();
	return f*k;
}
T pushup(T &tr,T lc, T rc){
	tr.sum=lc.sum+rc.sum;
	if(lc.mx>rc.mx){tr.mx=lc.mx;tr.numx=lc.numx;}
	else{tr.mx=rc.mx;tr.numx=rc.numx;}
	if(lc.rmx+rc.lmx>tr.mx){tr.mx=lc.rmx+rc.lmx;tr.numx=lc.numr+rc.numl;}
	if(lc.lmx>lc.sum+rc.lmx){tr.lmx=lc.lmx;tr.numl=lc.numl;}
	else{tr.lmx=lc.sum+rc.lmx;tr.numl=lc.len+rc.numl;}
	if(rc.lmx>rc.sum+lc.rmx){tr.rmx=rc.rmx;tr.numr=rc.numr;}
	else{tr.rmx=rc.sum+lc.rmx;tr.numr=rc.len+lc.numr;}
	return tr;
}
void build(int u,int L,int R){
	t[u].l=L;t[u].r=R;t[u].len=R-L+1;t[u].mid=(L+R)>>1;t[u].tag=0;
	if(L==R){
		t[u].lmx=t[u].rmx=t[u].mx=t[u].sum=a[L];
		t[u].numl=t[u].numr=t[u].numx=1;
		return;
	}
	int M=(L+R)>>1;
	build(ls,L,M);
	build(rs,M+1,R);
	pushup(t[u],t[ls],t[rs]);
	return;
}
void pushdown(int u){
	if(!t[u].tag) return;
	t[ls].sum+=t[ls].len*t[u].tag;
	t[ls].mx+=t[ls].numx*t[u].tag;
	t[ls].lmx+=t[ls].numl*t[u].tag;
	t[ls].rmx+=t[ls].numr*t[u].tag;
	t[rs].sum+=t[rs].len*t[u].tag;
	t[rs].mx+=t[rs].numx*t[u].tag;
	t[rs].lmx+=t[rs].numl*t[u].tag;
	t[rs].rmx+=t[rs].numr*t[u].tag;
	t[ls].tag+=t[u].tag;
	t[rs].tag+=t[u].tag;
	t[u].tag=0;return;
}
T query(int u,int l,int r){
	if(l<=t[u].l&&t[u].r<=r)return t[u];
	pushdown(u);
	if(t[u].mid>=r) return query(ls,l,r);
	if(t[u].mid<l) return query(rs,l,r);
	return pushup(g,query(ls,l,r),query(rs,l,r));
}
void update(int u,int l,int r,int z){
	if(l<=t[u].l&&t[u].r<=r){
		t[u].sum+=t[u].len*z;
		t[u].mx+=t[u].numx*z;
		t[u].lmx+=t[u].numl*z;
		t[u].rmx+=t[u].numr*z;
		t[u].tag+=z;
		//printf("[%d,%d]:%d %d %d %d\n",t[u].l,t[u].r,t[u].len,t[u].sum,t[u].mx,t[u].numx);
		return ;
	}
	if(t[u].l>r||t[u].r<l) return;
	pushdown(u);
	update(ls,l,r,z);update(rs,l,r,z);
	pushup(t[u],t[ls],t[rs]);
	//printf("[%d,%d]:%d %d %d %d\n",t[u].l,t[u].r,t[u].len,t[u].sum,t[u].mx,t[u].numx);
	return;
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;++i) a[i]=read();
	build(1,1,n);
	while(m--){
		op=read(),x=read(),y=read();
		if(op==2) printf("%lld\n",max(0ll,query(1,x,y).mx));
		else{z=read();update(1,x,y,z);
		//for(int i=1;i<=n;++i){
			//printf("%lld ",query(1,x,y).sum);
		}
	}
	return 0;
}
2024/4/7 21:02
加载中...