243이 문제를 간단한 정수를 AcWing (펜윅 나무) 펀치

주제 : https://www.acwing.com/problem/content/244/

질문의 의미 : 범위 증가, 쿼리 간격

아이디어는 : 우리는 원래의 차이 배열을 무너 뜨리는

Σi = 1xΣj = 1ib [J] = Σi = 1X (X-I + 1) B × [내가] = (X + 1) = Σi 1xb [I] = B × -Σi 1xi [I ]

 

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
#DEFINE 줄게 긴 긴
 #DEFINE lowbit (X), X (- X)
 CONST의  INT N = 2E5; 
LL의 C1 [N], C2 [N, N, m, A [N]; 
LL (LL의 X, Y의 LL)를 추가 
{ 
    대해 (LL = I의 X, I <= N; 난 + = lowbit (I)) 
    { 
        C1 [내가] + = Y; 
        C2의 [내가] + = X * Y; 
    } 
} 
(LL의 X)을 요청할 것이다 
{ 
    LL ANS = 0 ;
     (나는; LL I = X의 I- = lowbit (I)) 
        ANS + = (X + 1 ) * C1 [I] -C2의 [I]을;
    반환 ANS를; 
} 
INT 의 main () 
{ 
    는 scanf ( " %의 LLD %의 LLD \ 없음 " , 및 N, m);
    대해 (LL I = 1 ; 나는 <= N; 내가 ++ ) 
    { 
        는 scanf ( " %의 LLD를 " , & A [I]); 
        추가 (I A [I] -a [I- 1 ]); 
    } 
    getchar가 (); 
    반면 (M-- ) 
    { 
         CH = ) (getchar가;
        경우 (CH2 == ' Q ' ) 
        { 
            LL의 X, Y; 
            scanf와 ( " %의 LLD %의 LLD \ 없음 " , X, Y); 
            COUT << 요청 (Y) -ask (X- 1 ) << ENDL; 
        } 
        경우 (CH2 == ' C ' ) 
        { 
            LL의 X, Y, D; 
            scanf와 ( " % LLD % LLD % LLD \ n " , X, Y, d); 
            (X, d) 추가; 
            추가 (Y + 1 - d); 
        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/Lis-/p/11305737.html