당신은이 N의 정수, 1 , 2 , ..., N을 . 당신은 작업 두 가지를 처리해야합니다. 작업의 한 유형은 주어진 간격으로 각 번호에 어떤 주어진 숫자를 추가하는 것입니다. 다른 하나는 주어진 구간의 숫자의 합을 요청하는 것입니다.
입력
첫 번째 라인은 두 숫자 포함 N 과 Q가 . 1 ≤ N , Q ≤ 100000
번째 라인은 포함 된 N의 수의 초기 값 1 , 2 , ..., 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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }