펜윅 나무 (단일 지점 업데이트 쿼리 간격)

라이벌 국가 C 국가의 지속적인 군사 훈련이 시간은, 국가의 스파이 수석 C 데릭과 그의 부하는 최대 바쁜 단정하기 시작했다. N 개의 엔지니어링 캠프의 라인을 따라 배열 된 국가의 해안선, 데릭하고 깔끔 작업이 엔지니어 캠프의 활동을 모니터하는 것입니다. 고급 모니터링 도구의 일종, 각각의 캠프 C 맑은 파악 미국에서 엔지니어의 수의 결과로, 각 캠프에서 엔지니어의 수는 직원의 수를 증가 시키거나 감소시킬 수있다, 변화를 발생할 가능성이 있습니다,하지만 그들은 C를 벗어날 수 없다 나라를 모니터링 할 수 있습니다.
바로 10 명 캠프의 총의 많은 사람들에게 처음 세 개의 캠프를보고, 깔끔한 "데릭 단정 한 보고서 등 데릭로 얼마나 많은 사람들의 총 요청 연속 엔지니어링 캠프의 일정 기간을 유지하기 때문에 CIA는 연습을 정확하게 적의 전술을 공부 ! "깔끔한 즉시이 단락 및 보고서의 총 수를 계산하기 시작합니다. 그러나, 데릭은 단정의 속도를 계산하기 위해 적의 캠프의 수는 자주 변경하고, 데릭은 각 세그먼트가, 단정 한이 캠프, 곧 소진의 숫자로 가야했다 그래서 매번 다른 질문 점점 불만 : 단정 한 생각을! "당신은 내가 당신에게 너무 느려 고려 죽은 지방 소년, 화재": "당신은 정말 당신이 너무 저를 해고하고자하는 피곤한 일이다 수학 자신을 수행! "절망에서, 단정는, 윈드, 윈드 도움 컴퓨터 전문가를 호출했다 말했다 :"죽은 지방 소년, 당신은 일반적으로 멀티 포인트 ACM 제목이라고 및 멀티 포인트 산술 책을 볼 수 있습니까, 지금의 쓴 열매를 맛 "깔끔한은" 나는 ... 실수를 인정 "하지만 윈드 브레이커는 전화를 끊었습니다. 그가 정말로 충돌을 계산합니다 있도록 깔끔한 매우 화가, 지능형 독자, 당신은 그 일을 마칠 수 있도록하는 프로그램을 작성할 수있다? 프로그램의 효율성이 충분히 높지 않은 경우에, 깔끔한 여전히 데릭의 야단됩니다.

입력 제 라인 정수 T, T 데이터 세트 나타냈다.
각각의 양의 정수 N (N <= 50000)의 제 1 라인의 데이터 N은 적의 캠프 엔지니어, N과 다음 양의 정수를 나타내는 i는 i 번째 AI 개시 공학 캠프를 나타내는 양의 정수 인공 지능 가지고있다 개인 (1 <= 인공 지능 <= 50 ).
: 다음에, 커맨드를 갖는 각각의 행은, 명령은 네 개의 형태를 갖는다
. (1), 추가의 IJ, 난 및 j는 양의 정수 캠프 증가 개인 J i 번째 (j는하게는 30 이상이다)이고
, (2) 서브 IJ I 및 J 이것은, 양의 정수 캠프 J의 개인 (j가 30를 초과하지 않는)를 감소 i 번째 나타내며,
(. 3)의 질의 IJ, i 및 j는 i가 J를 <=, 양의 정수이며, j 번째의 캠프로, i 번째의 총 개수를 묻는 나타낸다;
(4) 단부는 단부, 각 데이터 세트에 나타나는 마지막 명령을 나타내고,
40,000 명령 각각의 데이터까지의
데이터의 i 번째 그룹의 출력, 제 출력 "나는 케이스"를 입력,
각 쿼리 쿼리 출력 질의 세그먼트를 나타내는 정수 캐리지 리턴의 총 수는,이 번호는 INT 내에서 유지된다.
샘플 입력
1 
10 
1 2 3 4 5 6 7 8 9 10 
쿼리 1~3 
3~6 추가 
쿼리 2~7 
하위 10 2 
6 3 추가 
쿼리 3~10 
샘플 출력
케이스 1 : 
6 
33 
59 

우수 블로그 https://blog.csdn.net/qq_39553725/article/details/76696168

사용법 #include <iostream> 
#INCLUDE <iostream> 
#INCLUDE <cstdio> 
#INCLUDE < 문자열 > 
#INCLUDE <CString을> 
#INCLUDE <알고리즘> 
#INCLUDE <STDIO.H> 
#INCLUDE < 문자열 .H>
 #DEFINE 렙 (I, N)를 위해 (INT I = 0; i가 (N <); 나는 ++)
 하여  스페이스 성병;
CONST의  INT의 N = 1,000,010 ;
 길이 의 ANS = 0 , 플래그 = 1 ;
int로 A [ 50009 ], C [ 50009를 ];
INT의 m;
 B [ 10 ]; 

INT lowerbit ( INT X) 
{ 
    복귀 , X (- X); 
} 

INT의 합 ( INT의 L, INT의 r)을 
{ 
    INT suml = 0 , sumr = 0 ;
    위한 ( int로 I = 1을, I> 0 ; I - = lowerbit (I)) 
    { 
        suml + = C [I]; 
    } 
    에 대해 ( int로 R = I를, I> 0 , I- = lowerbit (I)) 
    {
        sumr + = C [I]; 
    } 
    반환 sumr - suml을; 
} 


공극 업데이트 ( INT (X), INT V) 
{ 
    위해 ( int로 된 I = X의 단계; I <= m; I + = lowerbit (I)) 
    { 
        C [내가] + = V 단계; 
    } 
} 

INT 의 main () 
{ 
    INT의 N; 
    scanf와 ( " %의 D ' , N);
    INT ANS = 0 ;
    동안 (N-- ) 
    { 
        ANS ++; 
        의 printf ( " 케이스가 % d : \ n " , ANS); 
        scanf와 ( " %의 D ' , m); 
        memset 함수 (a, 0 , 는 sizeof (a)); 
        memset 함수 (C, 0 , 는 sizeof (c));
        위한 ( int로 I = 1 ; I <= m; 내가 ++ ) 
        { 
            scanf와 ( " 가 % d " , & A [I]); 
            업데이트 (I, A [I]); 
        } 
        동안 (~는 scanf ( " % s의 " , B))
        { 
            경우 (STRCMP (b, " 종료 " ) == 0 )
                 휴식 ;
            다른  경우 (STRCMP (b, " 쿼리 " ) == 0 ) 
            { 
                INT의 L, R; 
                scanf와 ( " % d 개 %의 D ' , L, R); 
                COUT << SUM (1 - 1 , R) << ENDL; 
            } 
            다른  경우 (STRCMP (B, " 추가 " ) == 0 ) 
            { 
                INTX, 값; 
                scanf와 ( " % d 개 %의 D ' , X, 값); 
                업데이트 (X, 값); 
            } 
            다른 
            { 
                INT의 X, 값; 
                scanf와 ( " % d 개 %의 D ' , X, 값); 
                업데이트 (X, - 값); 
            } 
        } 

    } 


    반환  0 ; 
}

 

추천

출처www.cnblogs.com/nonames/p/11274483.html