물 문제 Keduo 리튬 트리.
다음과 같이 코드가 실행된다 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#INCLUDE <비트 / stdc ++ H.> 사용 스페이스 성병; #DEFINE가 긴 긴 int로 #define한다 IT 설정 <노드> :: 반복자 #DEFINE의 담당자 (I는 A, B)에 대한 (등록 INT I = (A) 내가 <= (b)] 나 ++) CONST의 INT maxn = 1E5 + (5) ; INT의 N, m; INT A [maxn]; 구조체 노드 { INT의 L, R; 변경 가능한 부울 V; 노드 ( INT의 L, INT의 R = - 1 , INT의 V = 0 ) : L (L), (R) (R), V (V) {} 부울 연산자 <( CONST 노드 O) CONST { 복귀 L < 올; } }; 설정 <노드> 들; INT MAX ( int로 하는 INT의 B) { 반환 A> B를? A : B는} int입니다 판독 () { INT X = 0 , 플래그 = 0 ; 숯 CH = ' ' ; 반면 (! CH = ' - ' && (CH2 < ' 0 ' || CH> ' 9 ' CH =))getchar가 (); 경우 (CH2 == ' - ' ) { 플래그 = 1 ; CH = getchar가 (); } 동안 (CH2> = ' 0 ' && CH <=에서 ' 9 ' ) { (X) = (X << 1 ) + (X << 3 ) + (CH ^ ' 0 ' ); CH = getchar가 (); } 반환 플래그를? - X : X; } IT 분할 ( INT의 POS) { IT를= s.lower_bound (노드 (POS)); 경우 (IT = s.end () && IT-> L == POS!) 복귀 를; 이 - ; INT의 L = IT-> L, R = IT-> R, V = IT-> V; s.erase (IT); s.insert (노드 (L, POS - 1 , V)); 반환 s.insert (노드 (POS, R을 V)) 제.; } 무효 지정 ( INT의 L, INT의 R, INT의 발) { IT ITR = 스플릿 (R + 1 ) = ITL 분할 (l); s.erase (ITL, ITR); s.insert (노드 (L, R, 발)); } 무효되돌리기 ( INT의 L, INT의 R은) { IT ITR이 분할 = (R + 1 ) = ITL 분할 (l); 반면 (! = ITL ITR) { ITL -> V ^ = 1 ; ITL ++ ; } } INT의 합 ( INT의 L, INT의 R은) { IT ITR이 분할 = (R + 1 ) = ITL 분할 (l); INT ANS = 0 ; 동안 (ITL! = ITR)는 { ANS + = itl-> V? itl-> R - itl-> L + 1: 0 ; ITL ++ ; } 반환 ANS; } INT con_sum ( INT L, INT의 R은) { IT ITR이 분할 = (R + 1 ) = ITL 분할 (l); INT ANS = 0 , 지금 = 0 ; 동안 (ITL =! ITR) { 경우 ((itl->! {V)) ANS = MAX (ANS, 지금); 지금 = 0 ; } 다른 지금 + = itl-> R - itl-> L + 1; ITL ++ ; } 반환 MAX을 (ANS, 지금); } 공극 쓰기 ( INT의 X) { 경우 (X < 0 ) { putchar ( " - " ); X = - (X); } 경우 (x> 9 ) 기록 (X / 10 ); putchar (X의 % 10 + ' 0 ' ); } ) (주 서명 { N , m =) (= 판독 ) (판독; 렙 (I, 0 , N -1 ) { A [내가] = 읽기 (); s.insert (노드 (I, I, A [I])); } s.insert (노드 (N, N, 0 )); 렙 (I, 1 , m) { INT의 L, R, 선택; 해제 , R은 = () = 1 판독) (= 판독 ) (판독; 경우 지정 (L, R, (옵트!) 0 ); 다른 경우 (최적화 된 == 1 ) 할당 (L, R, 1 ); 다른 경우 (최적화 된 == 2 ) 되돌리기 (L, R); 다른 경우 (옵트의 == 3 ) { 물품 (SUM (L, R)); 의 printf ( " \ n을 " ); } 다른 { 쓰기 (con_sum (L, R)); 의 printf ( " \ n을 " ); } } 반환 0 ; }