线段树求调,orz
查看原帖
线段树求调,orz
774204
A_chicken_boy楼主2024/4/25 18:41
#include<bits/stdc++.h>
using namespace std ;
#define N 1000005
#define _f(i,a,b) for ( int i = (a) ; i <= (b) ; ++i )
inline int _c ( ){
	int XX=0,FF=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			FF*=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		XX=XX*10+ch-48;
		ch=getchar();
	}
	return XX*FF;
}
int n , qs ;
int a[N] ;
struct S{
	int l , r ;
	int flag1 , flag2 , flag3 ;
	int maxx ;
}t[4*N];
void Up ( int q ){
	t[q].maxx = max ( t[q<<1].maxx , t[q<<1|1].maxx ) ;
}
void Down ( int q ){
	if ( t[q].flag3 ){
		t[q<<1].flag1 = t[q].flag1 ;
		t[q<<1|1].flag1 = t[q].flag1 ;
		t[q<<1].flag2 = t[q].flag2 ;
		t[q<<1|1].flag2 = t[q].flag2 ;
		t[q<<1].maxx = t[q].flag1 + t[q].flag2 ;
		t[q<<1|1].maxx = t[q].flag2 + t[q].flag1 ;
		t[q<<1].flag3 = t[q<<1|1].flag3 = 1 ;
	}else{
		t[q<<1].flag2 += t[q].flag2 ;
		t[q<<1|1].flag2 += t[q].flag2 ;
		t[q<<1].maxx += t[q].flag2 ;
		t[q<<1|1].maxx += t[q].flag2  ;
	}
	t[q].flag1 = t[q].flag2 = t[q].flag3 = 0 ;
}
void build (int q , int l , int r ){
	t[q].l = l ;
	t[q].r = r ;
	t[q].flag3 = 0 ;
	t[q].maxx = -1e8 ;
	if ( l == r ){
		t[q].maxx = a[l] ;
		return ;
	}
	int mid = ( l + r ) >> 1 ;
 	build ( q <<1 , l , mid );
 	build ( q<<1|1 , mid + 1 , r ) ;
	Up(q) ;
}
void change ( int q , int l , int r , int x ){
//	cout <<t[q].l << " " << t[q].r << endl ;
	if ( l <= t[q].l && t[q].r <= r ){
		t[q].flag1 += x ;
		t[q].flag2 = 0 ;
		t[q].maxx = x ;
		t[q].flag3 = 1 ;
		return ;
	}
	Down ( q ) ;
	int mid = ( t[q].l + t[q].r ) >> 1 ;
	if ( l <= mid ) change ( q << 1 , l , r , x ) ;
	if ( r > mid ) change ( q << 1 | 1 , l , r , x ) ;
	Up ( q ) ;
}
void add ( int q , int l , int r , int x ){
	if( l <= t[q].l && t[q].r <= r ){
		t[q].flag2 += x ;
		t[q].maxx += x ;
		return ;
	}
	Down ( q ) ;
	int mid = ( t[q].l + t[q].r ) >> 1 ;
	if ( l <= mid ) change ( q << 1 , l , r , x ) ;
	if ( r > mid ) change ( q << 1 | 1 , l , r , x ) ;
	Up (q ) ;
}
long long askk ( int q , int l , int r ){
	if ( l <= t[q].l && t[q].r <= r ){
		return t[q].maxx ;
	}
	Down ( q ) ;
	long long maxn = -1e18 ;
	int mid = ( t[q].l + t[q].r ) >> 1 ; 
	if ( l <= mid ) maxn = max ( maxn , askk ( q<< 1 , l , r ) ) ;
	if ( r > mid ) maxn = max ( maxn , askk ( q << 1 | 1 , l , r  ) ) ;
	return maxn ;
}
int main ( ){
	cin >> n >> qs ;
	_f( i , 1 , n ){
		a[i] = _c( ) ;
	}
	build ( 1 , 1 , n ) ;
	int op ;
	int l , r , x ;
	_f ( i , 1 , qs ){
		op = _c( ) ;
		if ( op == 1 ){
			l = _c( );
			r = _c( );
			x = _c( );
			
			change ( 1 , l , r , x ) ;
		}else if ( op == 2 ){
			l = _c( ) , r = _c( ) , x = _c( ) ;
			add ( 1 , l , r , x ) ;
		}else {
			l = _c( ) , r = _c( ) ;
			cout << askk ( 1 , l , r ) << endl ;
		}
	}
	return 0 ;
}
2024/4/25 18:41
加载中...