#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineは長い長いっ の#define再登録 の#define PB一back の#define Fiの最初 の#defineが第二SE 空隙リード(INT&) { = 0。int型 D = 1 ; CHAR CH; 一方、(CH = GETCHAR()、CH> ' 9 ' || CH < ' 0 ' ) であれば(CH == ' - ' ) D = - 1 。= CH ^ 48 ; 一方、(CH = GETCHAR()、CH> = ' 0 ' && CH <= ' 9 ' ) =(<< 3)+(<< 1)+(CH ^ 48 )。* = D; } 構造体メモ { INT L、R。 変更可能なint型のV; 音符(INT L、INT R = - 1、INT V = 0){L = L、R = R、V = V;} ブール 演算子<(CONST注&X)のconst { 戻り L < XL。 } }。 セット <ノート> S; セット <注意> ::イテレータスプリット(INT POS) { オートそれは = ()注(POS)s.lower_boundと、 もし(!それ= s.end()&& IT-> L == POS)を返すことを。 それは - 。 もし(IT-> R <POS)戻りs.end()。 int型 L = IT-> L、R = IT-> R、V = IT-> V。 s.erase(それ)。 s.insert(音符(L、POS - 、V))。 リターン 1 s.insert(音符(POS、R、V))Fiの。 } ボイド変更(int型 L、int型の R、INT W) { オートIT2は、スプリット(R + = 1)、IT1 = スプリット(L)を、 s.erase(IT1、IT2)。 s.insert(音符(L、R、W))。 } ボイド変化(int型 L、INT R、int型のx、int型のY) { int型の和= 0 。 自動IT2 =スプリット(R + 1)、IT1 =スプリット(L)、それ= IT1。 ために(;!IT1 = IT2、IT1 ++)の合計+ = it1-> V it1-> R-it1-> L +?1:0 - = it1-> R-it1-> L +; s.erase(それ、IT2)。 s.insert(音符(L、R、0 )); もし(!合計)のリターン; IT2は、スプリット(Y + = 1)、IT1 = スプリット(X)を、 もし(和> = Y-X + 1 ) { s.erase(IT1、IT2)。 s.insert(音符(X、Y、1 ))。 リターン; } のための(; IT1 = IT2;!IT1 ++ ) { 場合(!it1-> V) { 合計1 。 もし(合計< 0 ) { 変更(IT1 - > L、it1-> R +和、1 )。 休憩; } 他 it1-> V = 1 。 } } } INT(ASK int型 L、INT R) { int型の和= 0、ANS = 0 。 オートIT2 =スプリット(R + 1)、IT1 = スプリット(L)。 用(;!IT1 = IT2、IT1 ++ ) { 場合(!it1-> v)の和+ = it1-> R-it1-> L + 1 。 他の ANS = MAX(合計、ANS)、合計= 0 ; } 戻り値のMAX(ANS、合計)。 } int型のmain() { int型N、M。 READ(n)は、(m)を読み出します。 s.insert(注(1、nは、1 ))。 s.insert(ノート(N + 1、N + 1、0 ))。 用(RE INT iは= 1、OP、L、R、X、Y、I <= M; I ++ ) { 読み取り(OP)。 場合(OP == 0)(L)を読み取り、(r)を読んで、(L、Rを変更します 0 )。 そう であれば(OP == 1 )(L)を読み取り、(r)を読み取り、(X)を読み取り、(y)を読んで、変更(L、R、X、Y)。 他(L)を読み取り、(r)を読み取り、のprintf(" %dの\ N " 、(L、R)を尋ねます)。 } 戻り 0 。 }