P1253求助
  • 板块学术版
  • 楼主54zyd
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/24 11:07
  • 上次更新2025/1/24 14:53:12
查看原帖
P1253求助
1353816
54zyd楼主2025/1/24 11:07
#include<bits/stdc++.h>
using namespace std;
#define v k-(t[d])*u
int n,m,a[100100],t[404000],q,x,y,k,u,z[101000];
void bu(int d,int l,int r){
	if(l==r){
		t[d]=a[l];
		return;
	}
	int f=(l+r)/2;
	bu(d*2,l,f);
	bu(d*2+1,f+1,r);
	t[d]=max(t[d*2],t[d*2+1]);
}
void dn(int d,int l,int r){
	if(z[d]){
		int f=(l+r)/2;
		z[d*2]+=z[d];
		z[d*2+1]+=z[d];
		t[d*2]+=z[d]*(f-l+1);
		t[d*2+1]+=z[d]*(r-f);
		z[d]=0;
	}
}
void la(int d,int l,int r){
	if(x<=l&&r<=y){
		z[d]+=v;
		return;
	}
	dn(d,l,r);
	int f=(l+r)/2;
	if(x<=f){
		la(d*2,l,f);
	}
	if(f<y){
		la(d*2+1,f+1,r);
	}
	t[d]=max(t[d*2],t[d*2+1]);
}
int findl(int d,int l,int r){
	if(x<=l&&r<=y){
		return t[d];
	}
	dn(d,l,r);
	int f=(l+r)/2,s=0;
	if(x<=f){
		s=max(s,findl(d*2,l,f));
	}
	if(f<y){
		s=max(s,findl(d*2+1,f+1,r));
	}
	return s;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	bu(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&q,&x,&y);
		if(q==1){
			u=1;
			scanf("%d",&k); 
			la(1,1,n);
		}
		if(q==2){
			u=0;
			scanf("%d",&k); 
			la(1,1,n); 
		}
		if(q==3){
			u=0;
			printf("%d\n",findl(1,1,n));
		}
		//printf("%d %d %d&\n",q,x,y);
	}
	return 0;
}
2025/1/24 11:07
加载中...