玄学的你谷之——
过不了样例一却能AC
样例一代码输出7 6 7,
但应该为7 6 -1
#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
ll a[1000010] , n , q ;
struct SegTree {
#define lc(u) (2*u)
#define rc(u) (2*u+1)
ll maxn[4000010] , cov[4000010] , add[4000010] ;
void build ( ll u , ll l , ll r ) {
cov[u] = -1 , add[u] = 0 ;
if ( l == r ) {
maxn[u] = a[l] ;
return ;
}
ll mid = (l+r)/2 ;
build ( lc(u) , l , mid ) ;
build ( rc(u) , mid+1 , r ) ;
maxn[u] = max(maxn[lc(u)],maxn[rc(u)]) ;
}
void pushtag ( ll u , ll l , ll r , ll k , ll b ) {
if ( k != -1 ) {
maxn[u] = k+b ;
cov[u] = k , add[u]= b ;
} else {
add[u] += b ;
maxn[u] += b ;
}
}
void pushdown ( ll u , ll l , ll r ) {
if ( cov[u] == -1 && add[u] == 0 ) return ;
ll mid = (l+r)/2 ;
pushtag ( lc(u) , l , mid , cov[u] , add[u] ) ;
pushtag ( rc(u) , mid+1 , r , cov[u] , add[u] ) ;
add[u] = 0 , cov[u] = -1 ;
}
void change ( ll u , ll l , ll r , ll ql , ll qr , ll k , ll b ) {
if ( ql <= l && r <= qr ) {
pushtag ( u , l , r , k , b ) ;
return ;
}
pushdown(u,l,r) ;
ll mid = (l+r)/2 ;
if ( ql <= mid ) change ( lc(u) , l , mid , ql , qr , k , b ) ;
if ( qr > mid ) change ( rc(u) , mid+1 , r , ql , qr , k , b ) ;
maxn[u] = max(maxn[lc(u)],maxn[rc(u)]) ;
}
ll query ( ll u , ll l , ll r , ll ql , ll qr ) {
if ( ql <= l && r <= qr ) {
return maxn[u] ;
}
pushdown ( u , l , r ) ;
ll mid = (l+r)/2 , ans = -1e18 ;
if ( ql <= mid ) ans = max(ans ,query ( lc(u) , l , mid , ql , qr )) ;
if ( qr > mid ) ans = max(ans ,query ( rc(u) , mid+1 , r , ql , qr )) ;
maxn[u] = max(maxn[lc(u)],maxn[rc(u)]) ;
return ans ;
}
#undef lc
#undef rc
}sgt;
int main () {
ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ;
cin >> n >> q ;
for ( int i = 1 ; i <= n ; i ++ ) cin >> a[i] ;
sgt.build(1,1,n) ;
for ( int i = 1 , op , x , y , k ; i <= q ; i ++ ) {
cin >> op >> x >> y ;
if ( op == 1 ) {
cin >> k ;
sgt.change(1,1,n,x,y,k,0) ;
} else if ( op == 2 ) {
cin >> k ;
sgt.change(1,1,n,x,y,-1,k) ;
} else {
cout << sgt.query(1,1,n,x,y) << '\n' ;
}
}
return 0 ;
}