あなたは持っている Nの 整数、 1、 2、...、 Nを。あなたは、操作の2種類に対処する必要があります。操作の一つのタイプは、所定の間隔で各番号にいくつかの与えられた数を追加することです。他には、一定の間隔での数字の合計を求めることです。
入力
最初の行は、二つの数字が含ま N と Qを。1≤ N、Q ≤100000は、
2行目は含ま Nの 番号の初期値は 1、 2、...、 A Nを。-1000000000≤ A iは 1000000000≤ 次の各 Qの 行操作を表します。"C BとCは "加算手段 Cを それぞれに A、 +1、...、 B。-10000≤
C ≤10000
"Q bが "和照会意味 A、 1、...、 bは。
出力
あなたはすべて答える必要が Qの 順でコマンドを。行中の一つの答え。
サンプル入力
5 10 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 使って 名前空間STD。 6 7のtypedef 長い 長LL。 8 INT T、N、jishu、M。 9 のconst int型 N = 100005 。 10 LL CNT1 [N]、[N] ARR、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 + = TEMP和* CNT1 [X] - CNT2 [X]。 25 X- = lowbits(X)。 26 } 27 リターン和。 28 } 29 30 INT メイン(){ 31 32 のscanf(" %D%dの"、&N、&M)。 33 のために(int型 iは= 1、D、iが++; iが<= N)(scanf関数" %のLLD "([1- [I] -arr ARR、Iを追加し、[I]、およびARR)1 ])。 34 チャー SS [ 10 ]。 35 のためには、(int型、I = 1 ; I <= M; iが++ ){ 36 のint D1、D2、D3と、 37 のscanf(" %sの" 、SS)。 38 であれば(SS [ 0 ] == ' Q ' ){ 39 のscanf(" %d個の%のD "、&D1&D2)。 40 のprintf(" %LLDする\ n "、クエリ(D2)-query(D1- 1 ))。 41 } 42 他{ 43 のscanf(" %D%D%D "、&D1&D2、およびD3)。 44 追加(d1は、D3)、追加(D2 + 1、 - D3)。 45 } 46 } 47 リターン 0 。 48 }