rt,WA on #7 #8 #9 #10
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 1e6+7;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int n, m, a[maxn];
struct Node
{
ll mx, chg, ad;
bool tag;
}t[maxn << 2];
void Build(int p, int l, int r)
{
if (l == r)
{
t[p].mx = a[l];
return;
}
int mid = (l + r) >> 1, ls = p << 1, rs = p << 1 | 1;
Build(ls, l, mid);
Build(rs, mid + 1, r);
t[p].mx = max(t[ls].mx, t[rs].mx);
return;
}
void pushdown(int p)
{
if (t[p].tag)
{
int ls = p << 1, rs = p << 1 | 1;
t[ls].tag = t[rs].tag = true;
t[ls].chg = t[rs].chg = t[p].chg;
t[ls].mx = t[rs].mx = t[p].chg + t[p].ad;
}
else
{
int ls = p << 1, rs = p << 1 | 1;
ll ad = t[p].ad;
t[ls].ad += ad;
t[rs].ad += ad;
t[ls].mx += ad;
t[rs].mx += ad;
}
t[p].tag = false;
t[p].ad = t[p].chg = 0;
return;
}
void Add(int p, int l, int r, int L, int R, int k)
{
if (L <= l && r <= R)
{
t[p].ad += k;
t[p].mx += k;
return;
}
pushdown(p);
int mid = (l + r) >> 1, ls = p << 1, rs = p << 1 | 1;
if (L <= mid)
Add(ls, l, mid, L, R, k);
if (mid < R)
Add(rs, mid + 1, r, L, R, k);
t[p].mx = max(t[ls].mx, t[rs].mx);
return;
}
void Change(int p, int l, int r, int L, int R, ll k)
{
if (L <= l && r <= R)
{
t[p].mx = t[p].chg = k;
t[p].ad = 0;
t[p].tag = true;
return;
}
pushdown(p);
int mid = (l + r) >> 1, ls = p << 1, rs = p << 1 | 1;
if (L <= mid)
Change(ls, l, mid, L, R, k);
if (mid < R)
Change(rs, mid + 1, r, L, R, k);
t[p].mx = max(t[ls].mx, t[rs].mx);
return;
}
ll Query(int p, int l, int r, int L, int R)
{
if (L <= l && r <= R)
return t[p].mx;
pushdown(p);
ll res = -INF;
int mid = (l + r) >> 1, ls = p << 1, rs = p << 1 | 1;
if (L <= mid)
res = max(res, Query(ls, l, mid, L, R));
if (mid < R)
res = max(res, Query(rs, mid + 1, r, L, R));
return res;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
Build(1, 1, n);
int op, l, r, x;
for (int i = 1; i <= m; ++i)
{
scanf("%d%d%d", &op, &l, &r);
if (op == 1)
{
scanf("%d", &x);
Change(1, 1, n, l, r, x);
}
else if (op == 2)
{
scanf("%d", &x);
Add(1, 1, n, l, r, x);
}
else
cout << Query(1, 1, n, l, r) << "\n";
}
return 0;
}