P1253线段树 写挂 ,只拿50分,但经过我的对照发现第六个点答案好像我答案一样 QWQ
#include <bits/stdc++.h>
#define PII pair <int, int>
#define int long long
#define DB double
namespace FastIO
{
inline void read(int MOD, int &ret){
char ch = getchar();int ngtv = 1;
if(MOD == 0) {while(ch < '0' || ch > '9'){if(ch == '-') ngtv = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ret = ret * 10 + (ch - '0');ch = getchar();}}
else {while(ch < '0' || ch > '9'){if(ch == '-') ngtv = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ret = (ret * 10 % MOD + (ch - '0') % MOD) % MOD;ch = getchar();} }
ret *= ngtv;}
inline void cread(char &ch){while(ch == ' ' || ch == '\n' || ch == '\r' || ch == 0) ch = getchar();ch = getchar();}
}
using namespace FastIO;
using namespace std;
const int N = 1e6 + 10, M = 4e6 + 10;
int n, m, A[N];
int op, x, y, k;
int max(int x, int y)
{
return x > y ? x : y;
}
struct Node
{
int left, right;
int Mx, tag1, tag2;
}Tree[M];
void init_tree(int x, int l, int r)
{
Tree[x].left = l;
Tree[x].right = r;
Tree[x].tag1 = -1145141919810;
if(l == r)
{
Tree[x].Mx = A[l];
return ;
}
int mid = (l + r) >> 1;
init_tree(x * 2, l, mid);
init_tree(x * 2 + 1, mid + 1, r);
Tree[x].Mx = max(Tree[x * 2].Mx, Tree[x * 2 + 1].Mx);
}
void pushdown(int x)
{
if(Tree[x].tag1 != -1145141919810)
{
Tree[x * 2].Mx = Tree[x].tag1;
Tree[x * 2 + 1].Mx = Tree[x].tag1;
Tree[x * 2].tag1 = Tree[x * 2 + 1].tag1 = Tree[x].tag1;
Tree[x].tag1 = -1145141919810;
Tree[x].tag2 = 0;
}
else
{
Tree[x * 2].Mx += Tree[x].tag2;
Tree[x * 2].tag2 += Tree[x].tag2;
Tree[x * 2 + 1].Mx += Tree[x].tag2;
Tree[x * 2 + 1].tag2 += Tree[x].tag2;
Tree[x].tag2 = 0;
}
}
void change(int x, int l, int r, int k)
{
if(r < Tree[x].left || Tree[x].right < l)
return ;
if(l <= Tree[x].left && Tree[x].right <= r)
{
Tree[x].tag1 = k;
Tree[x].tag2 = 0;
Tree[x].Mx = k;
return ;
}
pushdown(x);
change(x * 2, l, r, k);
change(x * 2 + 1, l ,r, k);
Tree[x].Mx = max(Tree[x * 2].Mx, Tree[x * 2 + 1].Mx);
}
void add(int x, int l, int r, int k)
{
if(r < Tree[x].left || Tree[x].right < l)
return ;
if(l <= Tree[x].left && Tree[x].right <= r)
{
Tree[x].Mx += k;
if(Tree[x].tag1 != -1145141919810)
Tree[x].tag1 += k;
else
Tree[x].tag2 += k;
return ;
}
pushdown(x);
add(x * 2, l, r, k);
add(x * 2 + 1, l, r, k);
Tree[x].Mx = max(Tree[x * 2].Mx, Tree[x * 2 + 1].Mx);
}
int mx(int x, int l, int r)
{
if(r < Tree[x].left || Tree[x].right < l)
return 0;
if(l <= Tree[x].left && Tree[x].right <= r)
return Tree[x].Mx;
pushdown(x);
return max(mx(x * 2, l, r), mx(x * 2 + 1, l, r));
}
signed main()
{
// freopen("P1253_6.in", "r", stdin);
// freopen("蒟蒻.out", "w", stdout);
scanf("%lld%lld", &n, &m);
for(int i = 1; i <= n; i ++ )
scanf("%lld", &A[i]);
init_tree(1, 1, n);
// puts("");
// for(int i = 1; i <= n * 2 + 1; i ++ )
// printf("%d %d %d %d %d %d\n", i, Tree[i].Mx, Tree[i].tag1, Tree[i].tag2, Tree[i].left, Tree[i].right);
// puts("");
while(m -- )
{
scanf("%lld%lld%lld", &op, &x, &y);
if(op == 1)
{
scanf("%lld", &k);
change(1, x, y, k);
}
else if(op == 2)
{
scanf("%lld", &k);
add(1, x, y, k);
}
else
printf("%lld\n", mx(1, x, y));
// puts("");
// for(int i = 1; i <= n * 2 + 1; i ++ )
// printf("%d %d %d %d %d %d\n", i, Tree[i].Mx, Tree[i].tag1, Tree[i].tag2, Tree[i].left, Tree[i].right);
// puts("");
}
return 0;
}