かなり明白な問題がありますか。クエリの変更、接頭辞や接頭辞配列の1つのポイント
フェンウィックツリーを維持することができます
元の配列ドルのために、問い合わせ位置が$ X $を設定されているの寄与に対応する各調査位置を検討[I] $ $ Iの特定の位置を$、それが寄与$(X-I + 1)* [I意志] $
すなわち、$ X * [I] - (I-1)* [I] $、ツリー直接2つの部分を維持するために、2つの配列を係合しています
詳細なbit_1を問うための$ $メンテナンスの$ A [i]は$、$ BIT_2 $メンテナンス$ A [i]は*(I-1)$、$ X $を提唱しています
BIT_2.query(X)$ - 答えは$ BIT_1.query(X)* xは
長い$ \長さ約$に注意してください。
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> 使用して 名前空間STD。 typedefの長い 長いLL。 インラインint型リード() { int型のx = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1。CH =getchar関数(); } 一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。} 戻りのx *のF。 } のconst int型 N = 2E5 + 7 。 INTのN、M。 構造体BIT { LLのT [N]。 インラインボイドは、追加(INT X、LL V){ 一方(X <= N)T [X] + = V、X + = X& - X。} インライン(ASK llの整数 X){LL RES = 0。同時に(X)RES + = T [x]は、x軸= X&-x。リターンのres; } } T1、T2。 INT [N]。 INT ()は、メイン { N =読み取る()、M = 読み取ります(); 以下のために(int型 I = 1 [I] = iが++; iが<= N) )(読み取ります。 用(int型 I = 1を T1.add(I、[i])と、T2.add(I、1LL * [I] *(I-; iが<= N iが++)1 ))。 チャー S [ 7 ]。INT X、Y。 以下のために(int型 I = 1 ; I <= M; iは++ ) { scanf関数(" %sの"、S); X = リード()。 もし(S [ 0 ] == ' Q '){のprintf(" %LLDする\ n "、T1.ask(X)* X-T2.ask(X)); 続け; } 、Y =読み取り()。T1.add(X、YA [X])。T2.add(X、1LL×(YA [X])*(X- 1 ))。 [X] = yと、 } 戻り 0 。 }