HDU1166 적 라인업 (펜윅 나무 템플릿 제목)

적 병사 라인업

시간 제한 : 2000/1000 MS (자바 / 기타) 메모리 제한 : 32,768분의 65,536 K (자바 / 기타)
총 제출 (들) : 147,556 허용 제출 (들) : 61126

문제 설명

라이벌 국가 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

 

이 문제는 아무것도 까다로운없는, 완전히 펜윅 트리를 이해하고, 나무와 같은 배열 템플릿 제목입니다,이 질문은 어렵지 않다.

다음과 같이 코드입니다 :

#INCLUDE <iostream> 
#INCLUDE <알고리즘> 
#INCLUDE <cmath> 
#INCLUDE <CString을> 
#INCLUDE <cstdio>
 #DEFINE MAXN 50010
 은 USING  공간 STD;
 INT N-]
 int로 트리 [MAXN * 2 , NUM은 [MAXN]
 INT lowbit ( INT X) {
     반환 X & (- X); 
} 
무효 추가 ( INT의 X, INT의 {P)을
     하면서 (X는 <= N-)는 {//이 여기에 내가 매우 낮은 수준의 오류를 만들어 다음과 같은 경우 기록 된 동안 결과는 WA왔다 
        트리 [X] + = P;
        X+ = lowbit (X); 
    } 
    반환 ; 
} 
공극 부 ( INT의 X, INT의 P) {
     동안 (X <= N) { 
        트리 [X] - = P; 
        X + = lowbit (X); 
    } 
    반환 ; 
} 
INT의 합 ( INT의 X) {
     INT ANS = 0 ;
    반면 (x> 0 ) { 
        ANS + = 트리 [X]; 
        X - = lowbit (X); 
    } 
    반환 ANS;
} 
INT 쿼리 ( INT L, INT의 R) {
     리턴 합 (R) -sum 1- ( 1 ); 
} 
INT 의 main () {
     INT의 t, 난, j는, k는, S = 1 ;
    문자열 str을; 
    CIN >> t;
    반면 (t-- ) { 
        CIN >> N; 
        memset 함수 (NUM, 0 , 는 sizeof (NUM)); 
        memset 함수 (나무, 0 , sizeof 연산자 (나무));
         (K = 1 , K <= N; ++ 케이  {)
            는 scanf를 (" %의 D " , NUM [K]); 
            추가 (K, NUM [K]); 
        } 
        의 printf ( " 케이스가 % d : \ n " , S); 
        S ++ ;
        반면 ((CIN >> STR) && (STR =! " 종료 " )) { 
            는 scanf ( " %의 D % d에 " , I, J);
            경우 (STR [ 0 ] == ' Q ' ) { 
                의 printf ( " % D \ 없음 " 쿼리 (I, J));
             만약 0 ] == ' ' ) { 
             NUM [내가] + = J; 
             추가 (I, J); 
        } 다른 경우 STR ([ 0 ] == ' S ' ) { 
            NUM [I]는 - = J; 
            서브 (I, J); 
        } 
        } 
    } 반환 0 ; 
}
             
     

 

추천

출처www.cnblogs.com/jianqiao123/p/11268917.html