P1253 线段树样例1过不掉求助
  • 板块题目总版
  • 楼主MunYixty
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/19 14:30
  • 上次更新2023/11/3 08:54:12
查看原帖
P1253 线段树样例1过不掉求助
868365
MunYixty楼主2023/7/19 14:30
//	freopen (".in", "r", stdin);
//	freopen (".out", "w", stdout); 
#include <bits/stdc++.h>
#define int long long
using namespace std; 
inline int read()
{
    int xr=0,F=1; char cr;
    while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
    while(cr>='0'&&cr<='9') 
        xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
    return xr*F;
}
inline void write(int n)
{
  if(n==0) return;
  write(n/10);
  putchar(n%10+'0');
}
int n,m; 
int a[1000005];
struct AA
{
	int l,r,mx,lazy1,lazy2,used;
}t[40000005];
void build(int l,int r,int i)
{
	t[i].l=l;
	t[i].r=r;
	t[i].mx=-1e18;
	if(l==r)
	{
		t[i].mx=a[l];
		return;
	}
	int mid=l+r>>1;
	build(l,mid,i*2);
	build(mid+1,r,i*2+1);
	t[i].mx=max(t[i*2].mx,t[i*2+1].mx);
}
void lazytap(int i)
{
	if(t[i].used)
	{
		t[i*2].lazy1=t[i].lazy1;
		t[i*2+1].lazy1=t[i].lazy1;
		t[i*2].lazy2=t[i].lazy2;
		t[i*2+1].lazy2=t[i].lazy2;
		t[i*2].used=1;
		t[i*2+1].used=1;
		t[i*2].mx=t[i].lazy1+t[i].lazy2;
		t[i*2+1].mx=t[i].lazy1+t[i].lazy2;
	}
	else 
	{
		t[i*2].lazy2+=t[i].lazy2;
		t[i*2+1].lazy2+=t[i].lazy2;
		t[i*2].mx+=t[i].lazy2;
		t[i*2+1].mx+=t[i].lazy2; 
	}
	t[i].lazy1=0;
	t[i].lazy2=0;
	t[i].used=0;
}
void change(int l,int r,int k,int i)
{
	if(t[i].l>=l&&t[i].r<=r)
	{ 
		t[i].lazy1=k;
		t[i].lazy2=0;
		t[i].mx=k;
		t[i].used=1;
		return;
	}
	lazytap(i);
	int mid=t[i].l+t[i].r>>1;
	if(l<=mid)change(l,r,k,i*2);
	if(r>mid)change(l,r,k,i*2+1);
	t[i].mx=max(t[i*2].mx,t[i*2+1].mx);	
}
void update(int l,int r,int k,int i)
{
	if(t[i].l>=l&&t[i].r<=r)
	{  
		t[i].lazy2+=k;
		t[i].mx+=k; 
		return;
	}
	lazytap(i);
	int mid=t[i].l+t[i].r>>1;
	if(l<=mid)change(l,r,k,i*2);
	if(r>mid)change(l,r,k,i*2+1);
	t[i].mx=max(t[i*2].mx,t[i*2+1].mx);	
}
int ask(int l,int r,int i)
{
	if(t[i].l>=l&&t[i].r<=r)
	{
		return t[i].mx;
	}
	lazytap(i);
	int mid=t[i].l+t[i].r>>1;
	int ans=-1e18;
	if(l<=mid)ans=max(ans,ask(l,r,i*2));
	if(r>mid)ans=max(ans,ask(l,r,i*2+1));
	return ans;
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	build(1,n,1);
	while(m--)
	{
		int op;
		op=read();
		if(op==1)
		{
			int l,r,k;
			l=read(),r=read(),k=read();
			change(l,r,k,1);
		}
		if(op==2)
		{
			int l,r,k;
			l=read(),r=read(),k=read();
			update(l,r,k,1);
			
		}
		if(op==3)
		{
			int l,r;
			l=read(),r=read();
			cout<<ask(l,r,1);
			printf("\n");
		}
		
	}
	return 0;
}
2023/7/19 14:30
加载中...