ZVitality @ 2023-06-08 12:26:07
rt,样例2过不了,输出 0。
#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int Read() {
int x = 0 , f = 1;
char c = getchar();
for( ; c < '0' || c > '9' ; c = getchar() ) f ^= ( c == '-' );
for( ; c >= '0' && c <= '9' ; c = getchar() ) x = ( x << 3 ) + ( x << 1 ) + ( c ^ 48 );
return f ? x : -x;
}
struct SegmentTree {
private:
struct Node {
Node *L , *R;
int l , r;
int sum , mx , add , cover;
Node( int l , int r ) :
l(l),r(r),sum(0),mx(LLONG_MIN),
add(0),cover(LLONG_MIN),
L(NULL),R(NULL)
{}
int mid() { return l + ( r - l ) / 2 ; }
int len() { return r - l + 1 ; }
void PushUp() {
sum = L->sum + R->sum;
mx = max( L->mx , R->mx );
}
void PushDown() {
if( cover != LLONG_MIN ) {
L->add = R->add = 0;
L->cover = R->cover = cover;
L->sum = R->sum = 0;
cover = LLONG_MIN;
}
L->add += add , R->add += add;
L->mx += add , R->mx += add;
L->sum += add * L->len() , R->sum += add * R->len();
add = 0;
}
};
public:
Node *root;
void Build( int l , int r , Node *&p , int a[] ) {
p = new Node( l , r );
if( l == r ) {
p->sum = p->mx = a[ l ];
return;
}
Build( p->l , p->mid() , p->L , a );
Build( p->mid() + 1 , p->r , p->R , a );
p -> PushUp();
}
void Add( int x , int y , int v , Node *p ) {
if( x <= p->l && p->r <= y ) {
p->sum += p->len() * v;
p->mx += v;
p->add += v;
return;
}
p->PushDown();
if( x <= p->mid() ) Add( x , y , v , p->L );
if( y > p->mid() ) Add( x , y , v , p->R );
p->PushUp();
}
int GetSum( int x , int y , Node *p ) {
if( x <= p->l && p->r <= y ) return p->sum;
p->PushDown();
int ans = 0;
if( x <= p->mid() ) ans += GetSum( x , y , p->L );
if( y > p->mid() ) ans += GetSum( x , y , p->R );
return ans;
}
void Assign( int x , int y , int v , Node *p ) {
if( x <= p->l && p->r <= y ) {
p->sum = v * p->len();
p->mx = v;
p->add = 0;
p->cover = v;
return;
}
p->PushDown();
if( x <= p->mid() ) Assign( x , y , v , p->L );
if( y > p->mid() ) Assign( x , y , v , p->R );
p->PushUp();
}
int GetMax( int x , int y , Node *p ) {
if( x <= p->l && p->r <= y ) {
return p->mx;
}
p->PushDown();
int ans = LLONG_MIN;
if( x <= p->mid() ) ans = max( ans , GetMax( x , y , p->L ) );
if( y > p->mid() ) ans = max( ans , GetMax( x , y , p->R ) );
return ans;
}
} seg;
const int _ = 1e6 + 5;
int a[_];
int n , q;
signed main() {
n = Read() , q = Read();
for( int i = 1 ; i <= n ; i++ ) a[ i ] = Read();
seg.Build( 1 , n , seg.root , a );
while( q-- ) {
int op = Read() , l = Read() , r = Read() , x;
if( op == 1 ) x = Read() , seg.Assign( l , r , x , seg.root );
if( op == 2 ) x = Read() , seg.Add( l , r , x , seg.root );
if( op == 3 ) printf( "%lld\n" , seg.GetMax( l , r , seg.root ) );
}
return 0;
}
by ZVitality @ 2023-06-08 15:02:10
噢,不对,是输出 10。