萌新50pts求调
查看原帖
萌新50pts求调
549097
FoVeR_Re楼主2024/9/28 19:44
#include <cstdio>
#define ll long long
const ll INF=-1e17-10;
const int N=1e6+10;
int n,m,op,x,y,tmp;
int d[N];
ll xds[N<<2];
ll t1[N<<2],t2[N<<2];
ll max(ll a,ll b){return a>b?a:b;}
inline void pushtag(int l,int r,int g){
	if(t2[g]!=INF){
		xds[g<<1]=t2[g]+t1[g];
		xds[g<<1|1]=t2[g]+t1[g];
		t1[g<<1]=0;
		t1[g<<1|1]=0;
		t2[g<<1]=t2[g];
		t2[g<<1|1]=t2[g];
	}
	else{
		xds[g<<1]+=t1[g];
		xds[g<<1|1]+=t1[g];
	}
	t1[g<<1]+=t1[g];
	t1[g<<1|1]+=t1[g];
	t2[g]=INF;
	t1[g]=0;
}
void build(int l,int r,int g){
	t2[g]=INF;
	if(l==r){
		xds[g]=d[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,g<<1);
	build(mid+1,r,g<<1|1);
	xds[g]=max(xds[g<<1],xds[g<<1|1]);
}
void add(int l,int r,int g){
//	printf("%d %d %d\n",l,r,g);
	if(l>=x && r<=y){
		xds[g]+=tmp;
		t1[g]+=tmp;
		return ;
	}
	int mid=(l+r)>>1;
	pushtag(l,r,g);
//	printf("%d %d %d %d\n",g,xds[g],t1[g],t2[g]);
	if(mid>=x)
		add(l,mid,g<<1);
	if(mid+1<=y)
		add(mid+1,r,g<<1|1);
	xds[g]=max(xds[g<<1],xds[g<<1|1]);
}
void update(int l,int r,int g){
	if(l>=x && r<=y){
		xds[g]=tmp;
		t1[g]=0;
		t2[g]=tmp;
		return ;
	}
	int mid=(l+r)>>1;
	pushtag(l,r,g);
	if(mid>=x)
		update(l,mid,g<<1);
	if(mid+1<=y)
		update(mid+1,r,g<<1|1);
	xds[g]=max(xds[g<<1],xds[g<<1|1]);
}
int query(int l,int r,int g){
	if(l>=x && r<=y)
		return xds[g];
	ll ans=INF;
	int mid=(l+r)>>1;
	pushtag(l,r,g);
	if(mid>=x)
		ans=max(ans,query(l,mid,g<<1));
	if(mid+1<=y)
		ans=max(ans,query(mid+1,r,g<<1|1));
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&d[i]);
	build(1,n,1);
//	for(int i=1;i<=n*4;i++)
//		printf("%d %d\n",i,xds[i]);
	while(m--){
		scanf("%d%d%d",&op,&x,&y);
		if(op==1){
			scanf("%d",&tmp);
			update(1,n,1);
//			printf("%d\n",xds[1]);
//			for(int i=1;i<=n*4;i++)
//				printf("%d %d\n",i,xds[i]);
//			for(int i=1;i<=n*4;i++)
//				printf("%d %d\n",i,t2[i]);
		}
		else if(op==2){
			scanf("%d",&tmp);
			add(1,n,1);
//			printf("%d\n",xds[1]);
//			for(int i=1;i<=n*4;i++)
//				printf("%d %d\n",i,xds[i]);
		}
		else{
//			for(int i=1;i<=n*4;i++)
//				printf("%d %d\n",i,xds[i]);
			printf("%d\n",query(1,n,1));
		}
	}
	return 0;
}

调了好久,不知道错哪了。

2024/9/28 19:44
加载中...