タイトル説明
それは、列の数にはよく知られている場合は、次の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の演算結果である線の整数を含んでいます。
サンプル入力と出力
5 1〜5 4 2 3 1 2 4 2 2 3 1 1 5 -1 1 3 5 7 2 4
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。