20pts求调qwq
查看原帖
20pts求调qwq
800406
KamLam楼主2025/1/27 15:30

麻烦大佬指正qwq

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000005;
int n,q;
int a[N],ans[N<<2],tag[N<<2],ctag[N<<2];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void up(int p){ans[p]=max(ans[ls(p)],ans[rs(p)]);}
inline void build(int p,int l,int r)
{
	tag[p]=0;
	ctag[p]=-1234567890;
	if(l==r)
	{
		ans[p]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	up(p);
}
inline void down(int p,int l,int r)
{
	int mid=(l+r)>>1;
	if(!tag[p])
	{
		ans[ls(p)]+=tag[p]*(mid-l+1);
		ans[rs(p)]+=tag[p]*(r-mid);
		tag[ls(p)]+=tag[p];
		tag[rs(p)]+=tag[p];
		tag[p]=0;
	}
	if(ctag[p]!=-1234567890)
	{
		int mid=(l+r)>>1;
		ans[ls(p)]=ctag[p]*(mid-l+1);
		ans[rs(p)]=ctag[p]*(r-mid);
		ctag[ls(p)]=ctag[p];
		ctag[rs(p)]=ctag[p];
		ctag[p]=-1234567890;
	}
}
inline void add(int l,int r,int p,int x,int y,int k)
{
	if(x<=l&&y>=r)
	{
		ans[p]+=k*(r-l+1);
		tag[p]+=k;
		return;
	}
	down(p,l,r);
	int mid=(l+r)>>1;
	if(x<=mid)add(l,mid,ls(p),x,y,k);
	if(y>mid)add(mid+1,r,rs(p),x,y,k);
	up(p);
}
inline void change(int l,int r,int p,int x,int y,int k)
{
	if(x<=l&&y>=r)
	{
		tag[p]=0;
		ans[p]=ctag[p]=k;
		return;
	}
	down(p,l,r);
	int mid=(l+r)>>1;
	if(x<=mid)change(l,mid,ls(p),x,y,k);
	if(y>mid)change(mid+1,r,rs(p),x,y,k);
	up(p);
}
inline int ask(int l,int r,int p,int x,int y)
{
	if(x<=l&&y>=r)return ans[p];
	int mid=(l+r)>>1;
	int c,d;
	c=d=-1e9;
	if(x<=mid)c=ask(l,mid,ls(p),x,y);
	if(y>mid)d=ask(mid+1,r,rs(p),x,y);
	return max(c,d);
}
signed main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(q--)
	{
		int op,l,r,x;
		cin>>op>>l>>r;
		if(op==1)
		{
			cin>>x;
			change(1,n,1,l,r,x);
		}
		if(op==2)
		{
			cin>>x;
			add(1,n,1,l,r,x);
		}
		if(op==3)cout<<ask(1,n,1,l,r)<<'\n';
	}
	return 0;
}
2025/1/27 15:30
加载中...