질문의 의미 :
XOR의 간격 또는 간격 심문 동작과 함께
모든 나무를 들어 당신은 선 세그먼트를 열 수 있습니다
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#INCLUDE <cstdio> #INCLUDE <iostream> #INCLUDE <CString을> 사용 스페이스 성병; #DEFINE에 대해 담당자는 (i, a가, b) (; 제가 (a) = int로 <= (b)] 나 ++) #DEFINE에 대한 REPP을 (I, a가, b) (INT I = (a) I> = (b) - I) #DEFINE가 긴 긴 것이다 #DEFINE (X) (cerr << (#의 X) << '='<< (X) << ENDL) 참조 #DEFINE의 0x3f3f3f3f INF #DEFINE의 CLR (A을 , V)가 memset (A · V를 sizeof A) ///////////////////////////////// / CONST의 INT의 N = 1E5 + 100 ; INT의 N, m; LL에서 t [ 25 ] [N << 2 ]2 , COL [ 25 ] [N << 2 ], A [N]; 무효화 (최대 INT의 ID, INT의 POS) { t [ID] [POS] = t의 [ID] POS << 1 ] + t [ID] POS << 1 | 1 ]; } 무효화 (다운 INT의 ID, INT의 POS, INT의 L, INT의 R) { INT 중간 = (L + R) >> 1 ; 경우 (! COL [ID]가 [POS]가 = - 1 ) { colfan [ID]가 [POS는 << 1 ] colfan [자료] = [POS << 1 |1 ] = 0 ; COL [ID] POS << 1 ] = COL [ID] POS << 1 | 1 = COL [ID] [POS]; t [ID] POS << 1 ] = 1ll * (MID-L + 1 ) * (COL) [ID] [POS]; t [ID] POS << 1 | 1 = 1ll * (R-MID) * COL [ID] [POS]; COL [ID] [POS] = - 1 ; } 경우 (colfan [ID] [POS] == 1 ) { colfan [ID] [POS] = 0 ; colfan [ID] POS << 1] ^ = 1 ; colfan [ID] POS << 1 | 1 ] ^ = 1 ; t [ID] POS << 1 ] = 1ll * (MID-L + 1 ) -t [ID] POS << 1 ]; t [ID] POS << 1 | 1 = 1ll * (R-MID) -t [ID] POS << 1 | 1 ]; } } 공극 빌드 ( INT의 ID, INT의 L, INT의 R, INT의 POS)를 { COL [ID] [POS] = - 1 ; colfan [ID] POS = 0; 경우 (L == R) { t [ID] [POS] = ((a [1] >> ID) 1 ); COL [ID]은 POS] = 0 ; 반환 ; } INT m = (L +의 연구) >> 1 ; 빌드 (ID, L, m, POS << 1 ) 작성 (ID, m + 1 , R, POS << 1 | 1 ); 최대 (ID, POS); } 공극 upfan ( INT의 ID, INT의 L, INT의 R, INT의 L, INT의 R, INT의 POS) { 만약(L <= 1 && R <= R) { t [ID] [POS] = (R-L + 1 ) - t [ID] [POS]; colfan [ID] [POS] ^ = 1 ; 반환 ; } INT m = (L + R) >> 1 ; 다운 (ID, POS, L, R); 경우 (L <= m) upfan (ID, L, R, L, m, POS << 1 ); 경우 (R> m) upfan (ID, L, R, m + 1 , R, POS << 1 | 1 ); 최대 (ID, POS); } 공극 upsum ( INT의 ID, INT의 L, INT의 R, INT의 V, INTL, INT의 R, INT의 POS) { 경우 (L <= 1 && R <= R) { t [ID] [POS] = (L + R- 1 ) * V; COL [ID] [POS] = V, colfan [ID] [POS] = 0 ; 반환 ; } 아래 (ID, POS, L, R); INT m = (L +의 연구) >> 1 ; 경우 (L <= m) upsum (ID, L, R, V, L, m, POS << 1 ); 경우 (R> m) upsum (ID, L, R, V, m + 1 , R, POS << 1 | 1 ); 최대 (ID, POS); } LL qsum ( INT의 아이디,INT의 L, INT의 R, INT의 L, INT의 R, INT의 POS) { 경우 (L <= 1 && R <= R) 복귀 t [ID] [POS]; INT의 m = (L + R) >> 1 ; LL ANS = 0 ; 다운 (ID, POS, L, R); 경우 (L <= m) + = qsum ANS (ID, L, R, L, m, POS << 1 ); 경우 (R> m) + = qsum ANS (ID, L, R, m + 1 , R, POS << 1 | 1 ); 반환 ANS를; } INT 의 main () { CLR (COL, - 1 ); 렙 (I, 1, N)는 scanf ( " %의 LLD " , & A [I]); 렙 (I, 0 , 22 )을 빌드 (I, 1 N, 1 ); scanf와 ( " %의 D ' , m); LL 연산, L, R, X; 반면 (M-- ) { 는 scanf ( " %의 LLD " , OP); 경우 (연산 == 1 ) { 는 scanf ( " %의 LLD의 %의 LLD ' , L, R); LL ANS = 0 ; 렙 (I,0 , 22 ) ANS + = 1ll * qsum (I, L, R, 1 N, 1 ) * (1ll << I); 의 printf ( " % LLD \ 없음 " , ANS); } 다른 경우 (연산 == 2 ) { 는 scanf ( " % LLD % LLD % LLD ' , L, R, X); 렙 (I, 0 , 22 ) 의 경우 ((X >> I) 1 ) upfan (I, L, R, 1 N, 1 ); } 다른 경우(연산 == 3 ) { 는 scanf ( " % LLD % LLD % LLD ' , L, R, X); 렙 (I, 0 , 22 ) 의 경우 ((X >> I) 1 ) upsum (I, L, R, 1 , 1 , N, 1 ); } 다른 경우 (연산 == 4 ) { 는 scanf ( " % LLD % LLD % LLD ' , L, R, X); 렙 (I, 0 , 22 의 경우) (((X >> I) 1 ) == 0 ) upsum (I, L, R, 0 , 1 , n은, 1 ); } } 반환 0 ; }