간단한 문제가 정수 (펜윅 나무 부분 변경 범위 쿼리)

당신은이  N의  정수,  12 , ...,  N을 . 당신은 작업 두 가지를 처리해야합니다. 작업의 한 유형은 주어진 간격으로 각 번호에 어떤 주어진 숫자를 추가하는 것입니다. 다른 하나는 주어진 구간의 숫자의 합을 요청하는 것입니다.

입력

첫 번째 라인은 두 숫자 포함  N  과  Q가 . 1 ≤  N , Q  ≤ 100000
번째 라인은 포함 된  N의  수의 초기 값  12 , ...,  N을 . -1000000000 ≤   1000000000. 하로 다음 각  Q의  라인 동작을 나타낸다. "C  B의 C는 "추가 수단  (C)을  각각  +1 , ...,  B . -10000 ≤ 

  C  ≤ 10000
"Q  B는 "합 질의 수단  +1 , ...,  B를 . 

산출

당신은 모든 대답해야 할  질문의  순서로 명령을. 한 줄에 하나의 대답.

샘플 입력

10 5 
1 2 3 4 5 6 7 8 9 10 
Q 4 4 
Q 1~10 
Q 2-4 
C 3 6 3 
Q 2~4

샘플 출력

4 
55 
9 
15
1 #INCLUDE <iostream>
 2 #INCLUDE <cstdio>
 3 #INCLUDE <CString을>
 4 #INCLUDE <알고리즘>
 5  이용  스페이스 성병;
6  
7 의 typedef  LL;
8  INT t, N, jishu, m;
9  CONST의  INT의 N = 100005 ;
10  LL의 CNT1 [N], 도착 [N], CNT2 [N];
11  INT lowbits ( INT X) { 돌아가 , X - X; }
 12  무효 추가 ( INT의 X, INT의 값) {
13      LL = 임시의 X;
14 일      동안 (X <= N) {
 15          CNT1 [X] + = 값;
16          CNT2 [X] + = 값 * (temp- 1 );
17          X + = lowbits (X);
18      }
 19  }
 20 LL 쿼리 ( INT X) {
 21      LL 합 = 0 ;
22      INT의 임시 용 = X;
23 일      동안 (x> 0 ) {
 24          합 + = CNT1 온도 * [X] - CNT2 [X];
25          X- = lowbits (X);
(26)     }
 27      리턴 합;
28  }
 29  
30  INT 의 main () {
 31  
(32)      는 scanf ( " %의 D % d에 " , N, m);
(33)      에 대한이 ( int로 I = 1 , D를, i가 N = <; 내가 ++)는 scanf를 ( " %의 LLD " , 도착이 [I])에 추가 (I 도착 [I] -arr [I- 1 ]);
34       SS [ 10 ];
(35)      에 대한이 ( int로 난 = 1 ; I <= m 내가 ++ ) {
 36          INT의 D1, D2, D3;
37          는 scanf (" %의 S " , SS);
38          의 경우 (SS [ 0 ] == ' Q ' ) {
 39              는 scanf ( " % d 개 %의 D ' , D1, D2);
40              의 printf ( " % LLD \ 없음 " 쿼리 (D2) - 쿼리 (D1 - 1 ));
(41)          }
 (42)          {
 43              는 scanf ( " % D % D % D ' , D1, D2, D3);
(44)              추가 (D1은 D3)에 추가 (D2 + 1 - D3);
45          }
46      }
 47      반환  0 ;
48 }
코드보기

 



추천

출처www.cnblogs.com/qq-1585047819/p/11417792.html