https://www.luogu.com.cn/record/66403840
悬赏....悬赏一个贴贴(
#include <bits/stdc++.h>
using namespace std;
inline int read() {
int num=0, nev=1; char ch = getchar();
while(!isdigit(ch)){ if(ch=='-') nev=-1; ch=getchar(); }
while (isdigit(ch)){ num=(num<<1)+(num<<3)+(ch^48); ch=getchar(); }
return num * nev;
}
inline void print(const long long& x) {
if (x<0) {print(-x); return;}
if (x<10) { putchar(x+'0'); return; }
print(x/10); putchar(x%10+'0'); return;
}
long long tree[1145141 << 2]; //线段树
long long add[1145141 << 2]; //加法标记
long long change[1145141 << 2]; //改数标记
long long a[114514 << 2];
void build(int k, int l, int r)
{
if(l==r) tree[k] = a[l];
else {
int mid = l + r >> 1;
build(k<<1, l, mid);
build(k<<1 | 1, mid+1, r);
tree[k] = max(tree[k<<1] , tree[k<<1 | 1]);
}
return;
}
void Add(int k, int l, int r, int v) //区间加
{
add[k] += v;
tree[k] += (r-l+1) * (long long) v;
return ;
}
void Change(int k, int l, int r, int v) //区间修改
{
change[k] = v;
tree[k] = v;
add[k] = 0;
return ;
}
void pushdown(int k, int l, int r, int mid)
{
if (add[k])
{
Add(k<<1, l, mid, add[k]);
Add(k<<1 | 1, mid+1, r, add[k]);
add[k] = 0;
}
if (change[k])
{
Change(k<<1, l, mid, change[k]);
Change(k<<1 | 1, mid+1, r, change[k]);
change[k] = 0;
}
return ;
}
void modify_add(int k, int l, int r, int x, int y, int v)
{
if (x<=l && r<=y)
{
Add(k,l,r,v);
return;
}
if (l>x || r<y)
{
return;
}
int mid = l + r >> 1;
pushdown(k, l, r, mid);
modify_add(k<<1, l, mid, x, y, v);
modify_add(k<<1 | 1, mid+1, r, x, y, v);
tree[k] = max( tree[k<<1] , tree[k<<1 |1]);
}
void modify_change(int k, int l, int r, int x, int y, int v)
{
if (x <= l && r <= y)
{
Change(k,l,r,v);
return;
}
if (l>x || r<y) return;
int mid =l + r >> 1;
pushdown(k, l, r, mid);
modify_change(k<<1, l, mid, x, y, v);
modify_change(k<<1 | 1, mid+1, r, x, y, v);
tree[k] = max ( tree[k<<1], tree[k<<1 | 1] );
return;
}
long long query(int k, int l, int r, int x, int y)
{
if (x<=l && r<=y) return tree[k];
if (l>y || r<x) return -1145141919810;
int mid = l + r >> 1;
pushdown(k, l, r, mid);
return max(query(k<<1,l,mid,x,y) , query(k<<1 | 1, mid+1, r, x, y));
}
int main()
{
int n=read(), m = read();
for (int i = 1; i <= n; i ++)
a[i] = read();
build(1,1,n);
for (int i = 1; i <= m; i ++)
{
int op = read();
if (op==1)
{
int l = read(), r = read(), x = read();
modify_change(1,1,n,l,r,x);
}
else
{
if (op==2)
{
int l = read(), r = read(), x = read();
modify_add(1,1,n,l,r,x);
}else{
int l = read(), r = read();
printf("%lld\n",query(1,1,n,l,r));
}
}
}
}