P3374 [テンプレート]フェンウィックの木1
トピックへのリンク:https://www.luogu.org/problem/P3374
トピック:
それは、列の数にはよく知られている場合は、次の2つの操作を実行する必要があります。
数xプラス1.
2.セクションの数を取得し、各
入力形式
最初の行は、2つの整数N、Mを含み、それぞれの列と操作の回数の合計数の数を表します。
数が初期値のIアイテムのi番目の列を表す第2のラインは、スペースで区切られたN個の整数を含みます。
次のMラインが3つの整数を含む次のように、それは、一つの操作を表します。
操作1:フォーマット:1つのXK意味:Xプラスkの数
操作2:フォーマット:2 XY意味:各区間の出力回数[X、Y]と
出力フォーマット
出力は、すべて2の演算結果である線の整数を含んでいます。
サンプル入力と出力
入力#1
5 1〜5 4 2 3 1 1 3 2 2 5 1 3 -1 1 4 2 2 1 4
出力#1
14 16
説明/ヒント
時間の制約:1000ミリ秒、128M
データスケール:
N <= 8、M <= 10:データの30%を
N <= 10000、M <= 10000:データの70%を
データの100%まで:N <= 500000、M <= 500000
サンプル説明:
14,16出力するように
// // 19-9-2にhanjinyuによって作成されます。 // の#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 const int型 MAXN = 1E6 + 10 。 INTのN、M。 int型ANS; INTの入力[MAXN]。 構造体ノード{ INT 左; int型、右; int型NUM; }ツリー[MAXN * 4 ]。 ボイド押し上げ(int型のインデックス) { ツリー[インデックス] .num =ツリー[索引<< 1] .num +ツリー[インデックス<< 1 | 1 ] .num。 } ボイドビルド(int型 L、int型の R、int型のインデックス) { ツリー[インデックス] .LEFT = L。 ツリー[インデックス] .RIGHT = R。 もし(L == R) { ツリー[インデックス] .num = 入力[L]。 返します。 } INT半ば=(L + R)>> 1 。 構築(リットル、ミッド、インデックス << 1 )。 構築(ミッド + 1、R、インデックス<< 1 |1 ); 突き上げ(インデックス)。 } ボイド変化(int型のインデックス、INT DIS、int型K) { 場合(ツリー[インデックス] .LEFT == ツリー[インデックス] .RIGHT) { ツリー[インデックス] .num + = K。 返します。 } であれば(DIS <=ツリー[索引<< 1 ] .RIGHT) 変化(インデックス << 1 、DIS、K)。 それ以外の 変更(インデックス << 1 | 1 、DIS、K); 突き上げ(インデックス)。 } 無効検索(int型インデックス、int型の L、INT R) { 場合(L <=ツリー[インデックス] .LEFT && R> = ツリー[インデックス] .RIGHT) { ANS + = ツリー[インデックス] .num。 返します。 } もし(ツリー[索引<< 1 ] .RIGHT> = L) 検索(インデックス << 1 、L、R)。 もし(ツリー[索引<< 1 | 1 ] .LEFT <= r)と 検索(インデックス << 1 | 1 、L、R)。 } int型のmain() { scanf関数("%D%D "&N、& M); のため(int型 I = 1は iがn = <; iは++ ) { scanf関数(" %のD 」、および入力[I]); } ビルド(1、nは、1 ) ; int型X、Y、Z、 のための(int型 I = 1 ; I <= M Iは++ ) { scanf関数(" %D%D%D "、およびX&Y、およびZ); もし(x == 1 ) 変化(1 、Y、Z) 他の 場合(Xの== 2 ) { ANS = 0 。 検索(1 、Y、Z) printf(" %d個の\ n " 、ANS)。 } } 戻り 0 。 }