求助佬大
查看原帖
求助佬大
906970
Jerry_Money楼主2025/1/20 12:58

50pts WA6789 RE10

#include<bits/stdc++.h>
#define int long long
#define INF -0x7fffffffffffffff
using std::cin;
using std::cout;
int n,m;
int b[1000086];
struct sb{
	int max,sum,cha,tag;//cha->change
}a[1000086];
void build(int w,int l,int r){
	a[w].cha=INF;
	if(l==r){
		a[w].sum=b[l];
		a[w].max=b[l];
		return;
	}
	int mid=(l+r)/2;
	build(2*w,l,mid);
	build(2*w+1,mid+1,r);
	a[w].sum=a[2*w].sum+a[2*w+1].sum;
	a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
void spread(int w,int l,int r){
	if(a[w].cha!=INF){
		int mid=(l+r)/2;
		a[2*w].sum=a[w].cha*(mid-l+1);
		a[2*w].cha=a[w].cha;
		a[2*w].max=a[w].max;
		a[2*w].tag=0;
		a[2*w+1].sum=a[w].cha*(r-mid);
		a[2*w+1].cha=a[w].cha;
		a[2*w+1].max=a[w].max;
		a[2*w+1].tag=0;
		a[w].cha=0;
	}
	if(a[w].tag){
		int mid=(l+r)/2;
		a[2*w].sum+=a[w].tag*(mid-l+1);
		a[2*w].tag+=a[w].tag;
		a[2*w].max+=a[w].tag;
		a[2*w+1].sum+=a[w].tag*(r-mid);
		a[2*w+1].tag+=a[w].tag;
		a[2*w+1].max+=a[w].tag;
		a[w].tag=0;
	}
}
void add(int w,int l,int r,int ql,int qr,int k){
	if(ql<=l&&qr>=r){
		a[w].tag+=k;
		a[w].sum+=k*(r-l+1);
		a[w].max+=k;
		return;
	}
	spread(w,l,r);
	int mid=(l+r)/2;
	if(ql<=mid)add(2*w,l,mid,ql,qr,k);
	if(qr>mid)add(2*w+1,mid+1,r,ql,qr,k);
	a[w].sum=a[2*w].sum+a[2*w+1].sum;
	a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
void change(int w,int l,int r,int ql,int qr,int k){
	if(ql<=l&&qr>=r){
		a[w].cha=k;
		a[w].sum=k*(r-l+1);
		a[w].tag=0;
		a[w].max=k;
		return;
	}
	spread(w,l,r);
	int mid=(l+r)/2;
	if(ql<=mid)change(2*w,l,mid,ql,qr,k);
	if(qr>mid)change(2*w+1,mid+1,r,ql,qr,k);
	a[w].sum=a[2*w].sum+a[2*w+1].sum;
	a[w].max=std::max(a[2*w].max,a[2*w+1].max);
}
int getmax(int w,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r)return a[w].max;
	spread(w,l,r);
	int mid=(l+r)/2,ans=0;
	if(ql<=mid)ans=std::max(ans,getmax(2*w,l,mid,ql,qr));
	if(qr>mid)ans=std::max(ans,getmax(2*w+1,mid+1,r,ql,qr));
	return ans;
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>b[i];
	build(1,1,n);
	while(m--){
		int op,l,r,k;
		cin>>op>>l>>r;
		if(!(op-1)){
			cin>>k;
			change(1,1,n,l,r,k);
		}
		else if(!(op-2)){
			cin>>k;
			add(1,1,n,l,r,k);
		}
		else{
			cout<<getmax(1,1,n,l,r)<<"\n";
		}
//		cout<<getmax(1,1,n,1,n)<<"----\n";
	}
	return 0;
}
2025/1/20 12:58
加载中...