蒟蒻求助,只过了前5个点
查看原帖
蒟蒻求助,只过了前5个点
362167
b1468821672楼主2022/11/24 16:08
#include<iostream>
using namespace std;
const int MAXN=1e6+10;
const int INF=1e10+10;
int n,m;
int a[MAXN];
struct tree
{
	int l,r;
	long long add;
	long long maxn,v;
}t[MAXN<<4];
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void build(int i,int l,int r)
{
	t[i].l=l,t[i].r=r;
	t[i].v=INF;
	if(l==r)
	{
		t[i].maxn=a[l];
		return;
	}
	int mid=l+r>>1;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline void push_down(int i)
{
	if(t[i].v!=INF)
	{
		t[i*2].maxn=t[i].v+t[i].add;
		t[i*2+1].maxn=t[i].v+t[i].add;
		t[i*2].v=t[i].v;
		t[i*2+1].v=t[i].v;
		t[i*2].add=t[i].add;
		t[i*2+1].add=t[i].add;
		t[i].add=0;
		t[i].v=INF;
	}
	if(t[i].add)
	{
		t[i*2].maxn+=t[i].add;
		t[i*2+1].maxn+=t[i].add;
		t[i*2].add+=t[i].add;
		t[i*2+1].add+=t[i].add;
		t[i].add=0;
	}
}
inline void add(int i,int l,int r,long long w)
{
	if(t[i].l>=l&&t[i].r<=r)
	{
		t[i].add+=w;
		t[i].maxn+=w;
		return;
	}
	push_down(i);
	int mid=t[i].l+t[i].r>>1;
	if(l<=mid)add(i*2,l,r,w);
	if(r>mid)add(i*2+1,l,r,w);
	t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline void change(int i,int l,int r,long long w)
{
	if(t[i].l>=l&&t[i].r<=r)
	{
		t[i].v=w;
		t[i].add=0;
		t[i].maxn=w;
		return;
 }
	push_down(i);
	int mid=t[i].l+t[i].r>>1;
	if(l<=mid)change(i*2,l,r,w);
	if(r>mid)change(i*2+1,l,r,w);
	t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline long long query(int i,int l,int r)
{
	if(t[i].l>=l&&t[i].r<=r)return t[i].maxn;
	push_down(i);
	int mid=t[i].l+t[i].r>>1;
	long long ans=0;
	if(l<=mid)ans=query(i*2,l,r);
	if(r>mid)ans=max(query(i*2+1,l,r),ans);
//	t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
	return ans;
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;++i)cin>>a[i];
	build(1,1,n);
//	cout<<query(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op=read(),l=read(),r=read(),x=0;
		if(op==1)
		{
			x=read();
			change(1,l,r,x);
		}
		if(op==2)
		{
			x=read();
			add(1,l,r,x);
		}
		if(op==3)
		{
			cout<<query(1,l,r)<<endl; 
		}
	}
}
2022/11/24 16:08
加载中...