代码如下
#include<bits/stdc++.h>
#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((seg[p].l+seg[p].r)>>1)
#define INF -(2<<29)
#define int long long
#define re register
using namespace std;
const int maxn=1e6+6;
int n,q,a[maxn];
inline long long read()
{
long long x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
struct SugmentTree
{
int l,r;
int mx;
int add;
int cover;
}seg[maxn<<2];
void update(int p)
{
seg[p].mx=max(seg[ls].mx,seg[rs].mx);
}
void build(int l,int r,int p)
{
seg[p].l=l,seg[p].r=r;
if (l==r)
{
seg[p].mx=a[l];
seg[p].cover=INF;
seg[p].add=0;
return ;
}
int m=(l+r)/2;
build(l,m,ls),build(m+1,r,rs);
update(p);
}
void spread_cover(int p)
{
if (seg[p].cover!=INF)
{
seg[ls].add=0,seg[rs].add=0;
seg[ls].mx=seg[p].cover;
seg[rs].mx=seg[p].cover;
seg[ls].cover=seg[p].cover;
seg[rs].cover=seg[p].cover;
seg[p].cover=INF;
}
}
void spread_add(int p)
{
if (seg[p].add)
{
spread_cover(p);
seg[ls].add+=seg[p].add;
seg[rs].add+=seg[p].add;
seg[ls].mx+=seg[p].add;
seg[rs].mx+=seg[p].add;
seg[p].add=0;
}
}
void modify_cover(int ql,int qr,int k,int p)
{
if (ql<=seg[p].l&&qr>=seg[p].r)
{
seg[p].add=0;
seg[p].mx=k;
seg[p].cover=k;
return ;
}
spread_cover(p),spread_add(p);
if (ql<=mid) modify_cover(ql,qr,k,ls);
if (qr>mid) modify_cover(ql,qr,k,rs);
update(p);
}
void modify_add(int ql,int qr,int k,int p)
{
if (ql<=seg[p].l&&qr>=seg[p].r)
{
spread_cover(p);
seg[p].add+=k;
seg[p].mx+=k;
return ;
}
spread_cover(p),spread_add(p);
if (ql<=mid) modify_add(ql,qr,k,ls);
if (qr>mid) modify_add(ql,qr,k,rs);
update(p);
}
int query(int ql,int qr,int p)
{
if (ql<=seg[p].l&&qr>=seg[p].r)
{
return seg[p].mx;
}
spread_cover(p),spread_add(p);
int ans=INF;
if (ql<=mid) ans=max(ans,query(ql,qr,ls));
if (qr>mid) ans=max(ans,query(ql,qr,rs));
return ans;
}
signed main()
{
n=read(),q=read();
for (re int i=1;i<=n;++i)
{
a[i]=read();
}
build(1,n,1);
while(q--)
{
int op,l,r,k;
op=read(),l=read(),r=read();
if (op==1)
{
k=read();
modify_cover(l,r,k,1);
}
else if (op==2)
{
k=read();
modify_add(l,r,k,1);
}
else
{
printf("%lld\n",query(l,r,1));
}
}
/*
modify_add(3,4,2,1);
cout<<query(1,4,1);
*/
return 0;
}
本rj觉得可能是区间加数的函数出问题了 很急在线等