线段树50分求调
查看原帖
线段树50分求调
243880
_KHIN楼主2024/3/19 19:45
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,sum[4000010],ans=0,a[4000010],x,y,tag[4000010],tag2[4000010],q;
void gou_zao(int o,int l,int r)
{
	if(l==r)
	{
		sum[o]=a[l];
		return;
	}
	int mid=(l+r)/2;
	gou_zao(o<<1,l,mid);
	gou_zao(o<<1|1,mid+1,r);
	sum[o]=max(sum[o<<1],sum[o<<1|1]);
}
void add(int o,int l,int r,int v)
{
	if(r<x||l>y)
	{
		return;
	}
	if(x<=l&&r<=y)
	{
		sum[o]=v;
		tag[o]=v;
		tag2[o]=0;
		return;
	}
	int mid=(l+r)/2;
	sum[o<<1]=tag[o];
	tag[o<<1]=tag[o];
	sum[o<<1|1]=tag[o];
	tag[o<<1|1]=tag[o];
	tag[o]=0;
	add(o<<1,l,mid,v);
	add(o<<1|1,mid+1,r,v);
	sum[o]=max(sum[o<<1],sum[o<<1|1]);
}
void add2(int o,int l,int r,int v)
{
	if(r<x||l>y)
	{
		return;
	}
	if(x<=l&&r<=y)
	{
		sum[o]+=v;
		tag2[o]+=v;
		return;
	}
	int mid=(l+r)/2;
	sum[o<<1]+=tag2[o];
	tag2[o<<1]+=tag2[o];
	sum[o<<1|1]+=tag2[o];
	tag2[o<<1|1]+=tag2[o];
	tag2[o]=0;
	add2(o<<1,l,mid,v);
	add2(o<<1|1,mid+1,r,v);
	sum[o]=max(sum[o<<1],sum[o<<1|1]);
}
int chaxun(int o,int l,int r)
{
	if(r<x||l>y)
	{
		return -1e9;
	}
	if(x<=l&&r<=y)
	{
		return sum[o];
	}
	int mid=(l+r)/2;
	if(tag[o])
	{
		tag2[o]=0;
		sum[o<<1]=tag[o];
		tag[o<<1]=tag[o];
		sum[o<<1|1]=tag[o];
		tag[o<<1|1]=tag[o];
		tag[o]=0;
	}
	else if(tag2[o])
	{
		sum[o<<1]+=tag2[o];
		tag2[o<<1]+=tag2[o];
		sum[o<<1|1]+=tag2[o];
		tag2[o<<1|1]+=tag2[o];
		tag2[o]=0;
	}
	return max(chaxun(o<<1,l,mid),chaxun(o<<1|1,mid+1,r));
}
signed main()
{
	cin>>n>>q;
	memset(sum,-0x3f3f3f3f,sizeof(sum));
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	gou_zao(1,1,n);
	for(int i=1;i<=q;i++)
	{
		int op,k;
		cin>>op>>x>>y;
		if(op==1)
		{
			cin>>k;
			add(1,1,n,k);
		}
		if(op==2)
		{
			cin>>k;
			add2(1,1,n,k);
		}
		if(op==3)
		{
			cout<<chaxun(1,1,n)<<endl;
		}
	}
}
2024/3/19 19:45
加载中...