求助玄关,交了不下15次,救救我
查看原帖
求助玄关,交了不下15次,救救我
931825
Bernie_qwq楼主2024/1/29 15:24
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6,inf=-70203201101314514;
struct node{
	int x,add,change;
}mx[maxn<<2];
int a[maxn];
void build(int k,int l,int r)
{
	mx[k].change=inf;
	if(l==r)
	{
		mx[k].x=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	mx[k].x=max(mx[k<<1].x,mx[k<<1|1].x);
}
void push(int k)
{
	if(mx[k].change!=inf)
	{
		mx[k*2].x=mx[k<<1|1].x=mx[k].change;
		mx[k<<1].change=mx[k<<1|1].change=mx[k].change;
		mx[k<<1].add=mx[k<<1|1].add=0;
		mx[k].change=inf;
	}
	if(!mx[k].add)
	{
		mx[k<<1].x+=mx[k].add;
		mx[k<<1|1].x+=mx[k].add;
		mx[k<<1].add+=mx[k].add;
		mx[k<<1|1].add+=mx[k].add;
		mx[k].add=0;
	}
}
void change(int k,int l,int r,int x,int y,int temp)
{
	if(x<=l&&r<=y)
	{
		mx[k].change=temp;
		mx[k].x=temp;
		mx[k].add=0;
		return ;
	}
	int mid=l+r>>1;
	push(k);
	if(x<=mid)
		change(k<<1,l,mid,x,y,temp);
	if(mid<y)
		change(k<<1|1,mid+1,r,x,y,temp);
	mx[k].x=max(mx[k<<1].x,mx[k<<1|1].x);
}
void add(int k,int l,int r,int x,int y,int temp)
{
	if(x<=l&&r<=y)
	{
		mx[k].x+=temp;
		mx[k].add+=temp;
		return ;
	}
	int mid=l+r>>1;
	push(k);
	if(x<=mid)
		add(k<<1,l,mid,x,y,temp);
	if(mid<y)
		add(k<<1|1,mid+1,r,x,y,temp);
	mx[k].x=max(mx[k<<1].x,mx[k<<1|1].x);
}
int Query(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
		return mx[k].x;
	int mid=l+r>>1;
	push(k);
	if(y<=mid)
		return Query(k<<1,l,mid,x,y);
	if(x>mid)
		return Query(k<<1|1,mid+1,r,x,y);
	return max(Query(k<<1,l,mid,x,y),Query(k<<1|1,mid+1,r,x,y));
}
signed main()
{
	int n,q,x,l,r;
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1;i<=q;i++)
	{
		scanf("%lld",&x);
		if(x==1)
		{
			scanf("%lld%lld%lld",&l,&r,&x);
			change(1,1,n,l,r,x);
		}else if(x==2)
		{
			scanf("%lld%lld%lld",&l,&r,&x);
			add(1,1,n,l,r,x);
		}else{
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",Query(1,1,n,l,r));
		}
		/*
		for(int j=1;j<=n<<2;j++)
			cout<<mx[j].x<<" ";
		cout<<endl;
		for(int j=1;j<=n<<2;j++)
			cout<<mx[j].add<<" ";
		cout<<endl;
		for(int j=1;j<=n<<2;j++)
			cout<<mx[j].change<<" ";
		cout<<endl;
		*/
	}
	/*
	1 2 3 4 5 6 7 8
	5 5 5 5 5 5 5 5
	6 6 6 6 6 6 6 6
	9 9 9 9 9 9 9 9
	*/
	return 0;
}
2024/1/29 15:24
加载中...