20分求救
查看原帖
20分求救
655089
wch2021楼主2024/10/21 15:55

rt,过了1、3两个点,其他全WA

#include<bits/stdc++.h>
#define int __int128
using namespace std;
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<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
inline void write(int x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>10) write(x/10);
	putchar(x%10+'0');
}
struct node
{
	int mx,lay,layj;
}tr[8000005];
void pu(int u)
{
	tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
}
void pd(int u)
{
	if(tr[u].lay!=-INT_MAX)
	{
		tr[u<<1].mx=tr[u<<1|1].mx=tr[u].lay;
		tr[u<<1].lay=tr[u<<1|1].lay=tr[u].lay;
		tr[u].lay=-INT_MAX;
	}
	tr[u<<1].mx+=tr[u].layj;
	tr[u<<1].layj+=tr[u].layj;
	tr[u<<1|1].mx+=tr[u].layj;
	tr[u<<1|1].layj+=tr[u].layj;
	tr[u].layj=0;
}
void build(int l,int r,int u)
{
	if(l==r)
	{
		tr[u].mx=read();
		tr[u].lay=-INT_MAX;
		return;
	}
	tr[u].mx=-INT_MAX;
	tr[u].lay=-INT_MAX;
	int mid=l+r>>1;
	build(l,mid,u<<1);
	build(mid+1,r,u<<1|1);
	pu(u);
}
void upd(int L,int R,int l,int r,int u,int x,int opt)
{
	if(L<=l&&r<=R)
	{
		if(opt==1)
		{
			tr[u].mx=x;
			tr[u].lay=x;
			tr[u].layj=0;
		}
		if(opt==2)
		{
			if(tr[u].lay!=-INT_MAX) tr[u].mx+=x;
			else tr[u].mx=tr[u].lay+tr[u].layj+x;
			tr[u].layj+=x;
		}
		return;
	}
	pd(u);
	int mid=l+r>>1;
	if(L<=mid) upd(L,R,l,mid,u<<1,x,opt);
	if(R>mid) upd(L,R,mid+1,r,u<<1|1,x,opt);
	pu(u);
}
int query(int L,int R,int l,int r,int u)
{
	if(L<=l&&r<=R) return tr[u].mx;
	pd(u);
	int mid=l+r>>1,ans=-INT_MAX;
	if(L<=mid) ans=max(ans,query(L,R,l,mid,u<<1));
	if(R>mid) ans=max(ans,query(L,R,mid+1,r,u<<1|1));
	return ans;
}
signed main()
{
//	freopen("P1253_2.in","r",stdin); 
//	freopen("P1253.out","w",stdout); 
	int n=read(),q=read();
	build(1,n,1);
	while(q--)
	{
		int opt=read(),l=read(),r=read();
		if(opt!=3) upd(l,r,1,n,1,read(),opt);
		else
		{
			write(query(l,r,1,n,1));
			putchar('\n');
		}
	}
	return 0;
}
2024/10/21 15:55
加载中...