线段树50ptsWA玄关
查看原帖
线段树50ptsWA玄关
1318814
wangqiyu_why楼主2025/1/23 19:40
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000005,M=-1e9;
int s[4*MAXN+1],m,n,a[MAXN],y,lz[4*MAXN+1],z,lz1[4*MAXN+1];
bool lz2[4*MAXN+1];
void build(int x,int l,int r)
{
	if(l==r)
	{
		s[x]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	s[x]=max(s[x*2],s[x*2+1]);
}
void pushdown(int x,int l,int r)
{
	if(lz2[x])
	{
		s[x*2]=lz1[x];
		s[x*2+1]=lz1[x];
		lz1[x*2+1]=lz1[x];
	    lz1[x*2]=lz1[x];
	    lz2[x]=0;
	    lz2[x*2]=1;
	    lz2[x*2+1]=1;
	}	
	s[x*2]+=lz[x];
	s[x*2+1]+=lz[x];
	lz[x*2]+=lz[x];
	lz[x*2+1]+=lz[x];
	lz[x]=0,lz1[x]=0;
}
void upd(int x,int l,int r,int lb,int rb,int v)
{
	if(lb<=l&&r<=rb)
	{
		s[x]=v;
		lz1[x]=v;
		lz2[x]=1;
		lz[x]=0;
		return;
	}
	if(lb>r||l>rb)
	{
		return;
	}
	pushdown(x,l,r);
	int mid=(l+r)/2;
	upd(x*2,l,mid,lb,rb,v);
	upd(x*2+1,mid+1,r,lb,rb,v);
	s[x]=max(s[x*2],s[x*2+1]);
}
void add(int x,int l,int r,int lb,int rb,int v)
{
	if(lb<=l&&r<=rb)
	{
		s[x]+=v;
		lz[x]+=v;
		return;
	}
	if(lb>r||l>rb)
	{
		return;
	}
	pushdown(x,l,r);
	int mid=(l+r)/2;
	add(x*2,l,mid,lb,rb,v);
	add(x*2+1,mid+1,r,lb,rb,v);
	s[x]=max(s[x*2],s[x*2+1]);
}
int ask(int l,int r,int x,int lb,int rb)
{
	if(lb<=l&&r<=rb)
	{
		return s[x];
	}
	if(lb>r||rb<l)
	{
		return M;
	}
	pushdown(x,l,r);
	int mid=(l+r)/2;
	return max(ask(l,mid,x*2,lb,rb),ask(mid+1,r,x*2+1,lb,rb));
}
int main(){
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,m);
	int g;
	for(int i=1;i<=n;i++)
	{
	    int k;
		scanf("%d%d%d",&g,&y,&z);
		if(g==1)
	    {
	    	scanf("%d",&k);
	    	upd(1,1,m,y,z,k);
		}
		else if(g==2)
		{
			scanf("%d",&k);
			add(1,1,m,y,z,k);
		}
		else if(g==3)
		{
			cout<<ask(1,m,1,y,z)<<endl;
		}
	}
	return 0;
}
2025/1/23 19:40
加载中...