整数とシンプルな問題(フェンウィックツリーセクションの変更、レンジクエリ)

あなたは持っている  Nの  整数、  1、  2、...、  Nをあなたは、操作の2種類に対処する必要があります。操作の一つのタイプは、所定の間隔で各番号にいくつかの与えられた数を追加することです。他には、一定の間隔での数字の合計を求めることです。

入力

最初の行は、二つの数字が含ま  N  と  Qを1≤  NQ  ≤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 }
コードの表示

 



おすすめ

転載: www.cnblogs.com/qq-1585047819/p/11417792.html
おすすめ