AND, OR, XOR 트리 라인

질문의 의미 :

XOR의 간격 또는 간격 심문 동작과 함께

 

모든 나무를 들어 당신은 선 세그먼트를 열 수 있습니다

#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 ; 
}
코드보기

 

추천

출처www.cnblogs.com/bxd123/p/11493515.html