1の#include <iostreamの> 2の#include <cstdioを> 3の#include <アルゴリズム> 4の#include <CStringの> 5の#include <cmath> 6 の#define LL長い長い 7 使って 名前空間STD。 8 9テンプレート<型名T> 空隙 内(T&X){ 10 、X = 0。T F = 1。チャー CH = GETCHAR()。 11 ながら(!isdigit(CH)){ 場合(CH == ' - ')、F = - 1; CH = GETCHAR();} 12 ながら(isdigit(CH)){X = 10 * X + CH - ' 0 '。CH = GETCHAR();} 13 X * = F。 14 } 15 16テンプレート<型名T> 無効 アウト(T X){ 17 であれば(X < 0)のputchar(' - ')、X = - X。 18 であれば(X> 9)アウト(X / 10 )。 19 のputchar(Xの%10 + ' 0 '); 20 } 21 22 // -------------------------------------------- ---------------- 23 24 のconst int型 N = 50005 。 25 26 のint N、Q、。 27 28 構造体ノード{ 29 int型のLM、RM、全て、合計; 30 } T [N << 2 ]。 31 32 空隙 P_up(ノード&U、ノードLS、ノードRS){ 33 u.sum = ls.sum + rs.sum。 34 u.all = MAX(MAX(ls.all、rs.all)、ls.rm + rs.lm)。 35 u.lm = MAX(ls.lm、ls.sum + rs.lm)。u.rm = MAX(rs.rm、rs.sum + ls.rm)。 36 u.all = MAX(u.all、MAX(u.lm、u.rm))。 37 } 38 39 ボイドビルドを(int型 U、int型、LをINT {R) 40 場合(L == R){ における(A)T [U] .LM = T [U] .rmのT = [U] .ALL = T [U] .SUM =。リターン;} 41 INT半ば=(L + R)>> 1 。 42 ビルド(U << 1、L、MID)。ビルドします(U << 1 | 1、ミッド+ 1 、R); 43 P_up(T [U]、T [U <<1 ]、T [U << 1 | 1 ])。 44 } 45 46 空隙 A(INT U、INT L、のint R、int型のx、int型K){ 47 であれば(L == R){T [U] .ALL = T [U] .LM = T [U] .rmのT = [U] .SUM = K。リターン;} 48 INT半ば=(L + R)>> 1 。 49 であれば(X <= MID)A(U << 1、L、中間、X、K)。そうでなければ(U << 1 | 1、中間+ 1 、R、X、K)。 50 P_up(T [U]、T [U <<1 ]、T [U << 1 | 1 ])。 51 } 52 53節点Q(INT U、INT L、のint R、int型のx、int型のY){ 54 であれば(X <= L && Y> = R){ 戻り [U]をTは;} // 重要 55 INTミッド=(L + R)>> 1 。 56 であれば(Y <= MID)リターン Q(uの<< 1 、L、中、X、Y) 57 他の 場合(X>半ば)、リターン Q(U << 1 | 1、ミッド+ 1 、R、X、Y)。 58 他{ 59 ノード_U、LS、RS。 60の LS = Q(uの<< 1、L、中間、X、MID)。RS = Q(uの<< 1 | 1、中間+ 1、R、中間+ 1 、Y); 61 P_up(_U、LS、RS)。 62 リターン_u。 63 } 64 } 65 66 INT メイン(){ 67 のint OP、X、Y。中(N) 68 ビルド(1、1 、N) 69 における(Q); 70 一方(q-- ){ 71 における(OP)。で(X)(Y) 72 もし A((OP!)1、1 、nは、X、Y) 73 他アウト(Q(1、1、nは、X、Y).ALL)のputchar(' の\ n ' ); 74 } 75 リターン0 。 76 }