史山求调
  • 板块灌水区
  • 楼主yhy2024
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/2 10:38
  • 上次更新2024/8/2 11:40:05
查看原帖
史山求调
1262406
yhy2024楼主2024/8/2 10:38

60分 WAon7、8、9、10

题目——腐朽的问题

#include<bits/stdc++.h>
#define N 1000005
#define int long long
#define gc getchar()
using namespace std;
int sum[N*4],lazy1[N*4],n,m,a[N*4],b,x2,y2,k2,lazy2[N*4],vis[N*4];
inline int read()
{
	int x=0,ss=1;
	char s=gc;
	while(!isdigit(s)&&s!='-')s=gc;
	if(s=='-')ss*=-1,s=gc;
	while(isdigit(s))x=(x<<1)+(x<<3)+s-'0',s=gc;
	return ss*x;
}
void pushup(int k){
	sum[k]=max(sum[k<<1],sum[k<<1|1]);
}
void add(int k,int x){
	sum[k]+=x;
	lazy1[k]+=x;
}
void revise(int k,int x){
	sum[k]=x;
	lazy1[k]=0;
	lazy2[k]=x;
	vis[k]=1;
}
void pushdown_1(int k){
	if(lazy1[k]==0){
		return;
	}
	add(k<<1,lazy1[k]);
	add(k<<1|1,lazy1[k]);
	lazy1[k]=0;
}
void pushdown_2(int k){
    if(vis[k]==0){
    	return;
	}
	revise(k<<1,lazy2[k]);
	revise(k<<1|1,lazy2[k]);
	vis[k]=0,lazy1[k]=0,lazy2[k]=0;
}
void build(int k,int l,int r){
	if(l==r){
		sum[k]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	pushup(k);
}
void modify(int k,int l,int r,int x,int y,int v){
	if(r<x||l>y) return;
	if(x<=l&&r<=y){
		add(k,v);
		return;
	}
    int mid=(l+r)>>1;
    pushdown_2(k);
  	pushdown_1(k);
    modify(k<<1,l,mid,x,y,v);
    modify(k<<1|1,mid+1,r,x,y,v);
    pushup(k);
}
void change(int k,int l,int r,int x,int y,int v){
	if(r<x||l>y) return;
	if(x<=l&&r<=y){
		revise(k,v);
		return;
	}
	int mid=(l+r)>>1;
	pushdown_2(k);
	pushdown_1(k);
	change(k<<1,l,mid,x,y,v);
	change(k<<1|1,mid+1,r,x,y,v);
	lazy1[k]=0;
	pushup(k);
}
int query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		return sum[k];
	}
	pushdown_2(k);
	pushdown_1(k);
	int mid=(l+r)>>1,ans=LONG_LONG_MIN;
	if(x<=mid) ans=max(ans,query(k<<1,l,mid,x,y));
	if(y>mid) ans=max(ans,query(k<<1|1,mid+1,r,x,y));
	pushup(k);
	return ans;
}
signed main()
{
	/*
	ios::sync_with_stdio(0);
    cin.tie(0);
	cout.tie(0);
	*/
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	//	cout<<i<<" "<<endl;
	}
	build(1,1,n);
//	cout<<sum[1];
	for(int i=1;i<=m;i++)
	{

		b=read();
		if(b==1)
		{
			x2=read(),y2=read(),k2=read();
			change(1,1,n,x2,y2,k2);
		}
		else if(b==2)
		{
			x2=read(),y2=read(),k2=read();
			modify(1,1,n,x2,y2,k2);
		}
		else{
			x2=read(),y2=read();
			cout<<query(1,1,n,x2,y2)<<endl;
		}
	}
	return 0;
}
2024/8/2 10:38
加载中...