P3368 [テンプレート]フェンウィックツリー2(問い合わせ間隔の一点を達成&変更)

タイトル説明

それは、列の数にはよく知られている場合は、次の2つの操作を実行する必要があります。

各セクションに加えて、いくつかの数x 1

2.数の値を取得

入力形式

最初の行は、2つの整数N、Mを含み、それぞれの列と操作の回数の合計数の数を表します。

数が初期値のIアイテムのi番目の列を表す第2のラインは、スペースで区切られたN個の整数を含みます。

次のMラインが2又は4の整数を含んでいる次のように操作を示します。

操作1:フォーマット:1 XYK意味:区間[X、Y]各数k個プラス

操作2:フォーマット:2 xは意味:x値出力の数

出力フォーマット

出力は、すべて2の演算結果である線の整数を含んでいます。

サンプル入力と出力

入力#1
5 
1〜5 4 2 3 
1 2 4 2 
2 3 
1 1 5 -1 
1 3 5 7 
2 4
出力#1
6 
10

説明/ヒント

時間の制約:1000ミリ秒、128M

データスケール:

N <= 8、M <= 10:データの30%を

N <= 10000、M <= 10000:データの70%を

データの100%まで:N <= 500000、M <= 500000

#include <iostreamの>
 使用して 名前空間STD;
 のconst  int型 INF = 500000 ;
 INT A [INF]、C [INF * 2 ];
 int型N-、M; 
 INT lowbit(INT X)
{ 
    戻り X&-X-を; // CMPを見つけます( 2、k)をkが末尾の数字0でなく、シーク1の端部の位置である
}
 ボイド更新(INT X、INT K)
{ 
    一方(X <= N-)
    { 
        C [X] = C [X] + ; K 
        X X + = lowbit(X); 
    } 
} 
int型(QuaryをINT X)
{ 
    int型の和= 0 一方、(X> 0 
    { 
        合計 =合計+ [X] C。
        X = X- lowbit(X)。
    } 
    戻り値の和。
} 
int型のmain()
{ 
    int型の OP、X、K、Y、今= 0 
    CIN >> N >> M。
    以下のためにint型 i = 1 ; iが<= N; iは++ 
    { 
        CIN >> [I]。
        アップデート(I、[I] - 今)。= [I]。
    } 
    一方(M-- 
    { 
        CIN >> OP。
        もし(OP == 1 
        { 
            CIN >> X >> Y >> K。
            アップデート(X、K)。
            アップデート(Y + 1、 - K)。
        } 
        そう であれば(オペアンプ== 2 
        { 
            CIN >> X。
            COUT << quary(X)<< ENDL。
        } 
    } 
    戻り 0 
}

イデオロギーの違いを使用します

差分を導入するには

提供される配列[] = {1,6,8,5,10}、その後、差分アレイは、B [] = {1,5,2、} -3,5-

すなわち、bは[i]は= [I] -a [I-1];([0] = 0;)、次に[I] = bの[1] + ... + B [i]は(これは素敵な証明書です)。

区間[2,4]の単語プラス2である場合

配列[] = {1,8,10,7,10}なり、B配列は、B = {1,7,2、-3,3}となります。

見つからない場合、唯一の配列[2] B及びB B [5]の区間[2,4]プラス2は同時にのでように区間Bにおいて、変更された[I] -b [I-1]ではありません変更。

そう区間[x、y]は変更することが、唯一の変更B [X]およびb [Y + 1]:

B [X] = bの[X] + K; B [Y + 1] = bの[Y + 1] -k。

おすすめ

転載: www.cnblogs.com/liuzhaojun/p/11274178.html