タイトル説明
長さN A、及びMの一連の命令が与えられると、各命令は、以下のいずれであってもよいです。
図1は、 "CのLRD" は、A [L]、[L + 1]、...、A [R]がプラスDいる表します。
2、「QのLR」は、Lの数〜R及び質問の列番号を表します。
各お問い合わせについては、出力整数の答え。
入力形式
二つの整数N、Mの最初の行
Nの第2行は、[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を有する配列を変更するために、メンテナンス更新の単一の値を指すことができ、[I] Bプレフィックス配列を得ることができ、更新された値[I] 。次に、どのように我々は、間隔を計算し、更新後のことですか?プレフィックスを我々見つけて、配列[1〜X]を求めると等価である、彼はのように書くことができます。
その後、我々は、私はB [i]と接頭辞を* Cを維持するために、配列を再利用することができます。次に必要となる問題(和[R] +(R + 1)*クエリ(B、R)-query(C、R)) - (和[L-1] + L *クエリ(B、L-1 )-query(C1、L-1))
コード:
#include <ビット/ STDC ++ H> の#defineが長い長いっ の#define LL符号なしULLを 使用して 名前空間STDを、 CONSTの INT N = 1E5 + 10 。 constの ダブル EPS = 1E- 8 ; LL [N]、C [ 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は、整数X){ LL ANS = 0 。 一方、(X){ 年間 + = C [K] [X]。 X - = lowbit(X)。 } 返す歳; } INT のmain(){ int型N、M、L、R、X。 チャー S [ 5 ]。 scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 i = 1 ; iが++; iが<= N ){ scanf関数(" %のLLD "、および[I])。 和[I] =和[I- 1 ] + [I]。 } 一方、(M-- ){ scanf関数(" %sの" 、S); もし(S [ 0 ] == ' Q ' ){ scanf関数(" %dの%のD "、&L&R)。 LL ANS =和[R] +(R + 1)*クエリ(0、R)-query(1 、R)。 年間 - [1-和= 1 ] +のL *クエリ(1、1- 1)-query(1、1- 1 )。 printf(" %LLDする\ n " 、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 ; }