AC code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6+99 , inf = 1e11;
int n , q , a[maxn] , w[maxn*4] , lzy[maxn*4] , lzy2[maxn*4];
void pushup(int u)
{
w[u] = max(w[u*2],w[u*2+1]);
}
void build(int u , int l , int r)
{
lzy2[u] = inf;
if (l == r)
{
w[u] = a[l];
return ;
}
int mid = (l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void maketag(int u , int len , int op , int x)
{
if (op == 2)
{
w[u] += x;
lzy[u] += x;
}
else
{
w[u] = x;
lzy[u] = 0;
lzy2[u] = x;
}
}
void pushdown(int u , int l , int r)
{
int mid = (l+r)/2;
if (lzy2[u] != inf)
{
maketag(u*2,mid-l+1,1,lzy2[u]);
maketag(u*2+1,r-mid,1,lzy2[u]);
lzy2[u] = inf;
}
maketag(u*2,mid-l+1,2,lzy[u]);
maketag(u*2+1,r-mid,2,lzy[u]);
lzy[u] = 0;
}
void update(int u , int l , int r, int L , int R , int op , int x)
{
if (l >= L && r <= R)
{
maketag(u,r-l+1,op,x);
}
else if (!((l > R) || (r < L)))
{
int mid = (l+r)/2;
pushdown(u,l,r);
if (mid >= L)update(u*2,l,mid,L,R,op,x);
if (mid <= R)update(u*2+1,mid+1,r,L,R,op,x);
pushup(u);
}
}
int query(int u , int l , int r , int L , int R)
{
if (l >= L && r <= R)
{
return w[u];
}
else if (!((l > R) || (r < L)))
{
pushdown(u,l,r);
int mid = (l+r)/2;
return max(query(u*2,l,mid,L,R),query(u*2+1,mid+1,r,L,R));
}
else
{
return -inf;
}
}
signed main()
{
scanf("%lld%lld",&n,&q);
for (int i = 1;i <= n;i++)
{
scanf("%lld",&a[i]);
}
build(1,1,n);
for (int i = 1;i <= q;i++)
{
int op , l ,r , x;
scanf("%lld%lld%lld",&op,&l,&r);
if (op != 3)
{
scanf("%lld",&x);
update(1,1,n,l,r,op,x);
}
else
{
printf("%lld\n",query(1,1,n,l,r));
}
}
return 0;
}
样例不过:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6+99 , inf = 1e11;
int n , q , a[maxn] , w[maxn*4] , lzy[maxn*4] , lzy2[maxn*4];
void pushup(int u)
{
w[u] = max(w[u*2],w[u*2+1]);
}
void build(int u , int l , int r)
{
if (l == r)
{
w[u] = a[l];
return ;
}
int mid = (l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void maketag(int u , int len , int op , int x)
{
if (op == 2)
{
w[u] += x;
lzy[u] += x;
}
else
{
w[u] = x;
lzy[u] = 0;
lzy2[u] = x;
}
}
void pushdown(int u , int l , int r)
{
int mid = (l+r)/2;
if (lzy2[u] != inf)
{
maketag(u*2,mid-l+1,1,lzy2[u]);
maketag(u*2+1,r-mid,1,lzy2[u]);
lzy2[u] = inf;
}
maketag(u*2,mid-l+1,2,lzy[u]);
maketag(u*2+1,r-mid,2,lzy[u]);
lzy[u] = 0;
}
void update(int u , int l , int r, int L , int R , int op , int x)
{
if (l >= L && r <= R)
{
maketag(u,r-l+1,op,x);
}
else if (!((l > R) || (r < L)))
{
int mid = (l+r)/2;
pushdown(u,l,r);
if (mid >= L)update(u*2,l,mid,L,R,op,x);
if (mid <= R)update(u*2+1,mid+1,r,L,R,op,x);
pushup(u);
}
}
int query(int u , int l , int r , int L , int R)
{
if (l >= L && r <= R)
{
return w[u];
}
else if (!((l > R) || (r < L)))
{
pushdown(u,l,r);
int mid = (l+r)/2;
return max(query(u*2,l,mid,L,R),query(u*2+1,mid+1,r,L,R));
}
else
{
return -inf;
}
}
signed main()
{
scanf("%lld%lld",&n,&q);
for (int i = 1;i <= n;i++)
{
scanf("%lld",&a[i]);
}
memset(lzy2 , inf , sizeof lzy2);
build(1,1,n);
for (int i = 1;i <= q;i++)
{
int op , l ,r , x;
scanf("%lld%lld%lld",&op,&l,&r);
if (op != 3)
{
scanf("%lld",&x);
update(1,1,n,l,r,op,x);
}
else
{
printf("%lld\n",query(1,1,n,l,r));
}
}
return 0;
}
为什么用memset会出问题