제목 설명
길이 n은 일련의 주어와 M의 설명은, 각각의 명령은 다음 중 하나 일 수있다 :
1 "C의 LRD"는 A [L], A [L + 1], ..., A [R]을 더한 D이다 나타낸다.
2 'Q의 LR은 "L의 개수를 나타낸다 ~ R 및 심문 열 번호.
각 질문의 경우, 출력 정수 대답.
입력 형식
두 정수의 제 N 라인, M.
n 개의 번째 행은 A [I]의 정수.
M은 M 행을 다음 명령어 피사체 설명에서와 같이 각각의 명령 포맷을 나타낸다.
출력 형식
각 질문의 경우, 출력 정수 대답.
줄에 각각의 대답.
데이터 범위
1 ≤ N , M ≤ 10 5 1≤N, M≤105,
| D | ≤ 10000 | D | ≤10000,
| [ I ] | ≤ 1000000000 | A [I] | ≤1000000000
샘플 입력 :
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
해결 방법 : 우리는 펜윅 트리의 기본적인 사용이 접두사 및 업데이트의 순서뿐만 아니라 단일 지점을 유지하는 것입니다 알고있다. 우리는 어레이 B의 배열을 변경하는 보수 업데이트의 단일 값을 가리킬 수 있고, A [i]는 B 프리픽스 배열이 획득 될 수 있고 갱신 된 값이 [I] . 그럼 우리는 어떻게 간격과 업데이트 뒤에 계산합니까? 우리는 접두사와 추구에 해당하는 배열 [~ X 1] 발견 , 그가로 기록 될 수 있습니다 :
그럼 내가 B [I] 및 접두어 *는 C를 유지하도록 배열을 재사용 할 수있다. 다음, 필수가되는 문제 (총합 (R) + (R + 1) * 쿼리 (B, R) - 쿼리 (C, R)) - (합 [L-1] + L * 쿼리 (b, L-1 ) - 쿼리 (C1, L-1))
코드 :
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#INCLUDE <. 비트 / stdc ++ H> #DEFINE가 긴 긴 줄게 #DEFINE의 LL ULL 부호를 이용하여 스페이스 성병; CONST의 INT N = + 1E5 (10) ; CONST 두 EPS 1e- = 8 ; LL A [N], 3 [ 2 ] [N], 합계 [N]; INT lowbit ( INT X) { 복귀 , X (- X)} 공극 추가 ( INT의 K, INT (X), INT의 Y) { 동안 (X < N) { C [K] [X] + = Y; X + =lowbit (X); } } LL 쿼리 ( INT의 K, INT의 X) { LL ANS = 0 ; 반면 (X) { ANS + = C [K] [X]; X - = lowbit (X); } 반환 ANS; } INT 의 main () { INT의 N, M, L, R, X; 문자 S [ 5 ]; scanf와 ( " %의 D % d에 " , N, m); 위한 ( int로 I = 1 ; I ++는, 난 <= N ) { (는 scanf" %의 LLD " , & A [I]); 합 [내가] = 합계 [I- 1 ] + A [I]; } 동안 (M-- ) { 는 scanf ( " %의 S ' , S); 경우 (S [ 0 ] == ' Q ' ) { 는 scanf ( " % d 개 %의 D ' , L, R); LL ANS = 합 (R) + (R + 1 ) * 쿼리 ( 0 , R) - 쿼리 ( 1 , R); ANS - 합계 = [1- 1 ] + L * 쿼리 ( 1 , 1-1 ) - 쿼리 ( 1 , 1- (1) ); 의 printf ( " % LLD \ 없음 " , ANS); } 다른 경우 (S [ 0 ] == ' C ' ) { 는 scanf ( " % D % D % D ' , L, R, X); 추가 ( 0 , L, X); 추가 ( 0 , R + 1 - X); 추가 ( 1 , L, L 개의 * X); 추가 ( 1 , R + 1 , - (R + 1 ) * X); } } 반환 0 ; }