[テンプレート]フェンウィックツリー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

サンプル説明:

したがって、出力は6,10です

 

分析:

これは、テンプレートの問題EMです。説明されていません。コード。

 

コード:

 

1の#include <cstdioを>
 2の#include <CStringの>
 3の#include <cmath>
 4の#include <iostreamの>
 5の#include <アルゴリズム>
 6  使って 名前空間STD。
7  int型N、M。
8  長い 長い和[ 555555 ]。
9  ボイド(追加のint X、長い 長いY){
 10      ながら(X <= N){
 11          和[X] + = Y。
12          X + = X& - X。
13      }
 14      リターン;
15  }
 16  長い 長い(ASK INT X){
 17の     長い のANS = 0 18      一方(X> = 1 ){
 19の          ANS + = 和[X]。
20          のx = X& - X。
21      }
 22の     リターンANS。
23  }
 24  長い FR(){
 25      チャー C = GETCHAR()。長い 長い ANS = 0 ; ブールフラグ= 1 26     一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')フラグ= 0、C = GETCHAR();}
 27      ながら(> = C ' 0 ' && C <= ' 9 '){ANS =(ANS << 1)+(ANS << 3)+(C ^ 48)、C = GETCHAR();}
 28      であれば(フラグ)リターン ANS。戻る - ANS;
        長いA、B、C、D。
32      のscanf(" %D%dの"、&​​N、&M)。
33      のためにint型 i = 1 ; iが<= N; iが++ ){
 34          A = FR()。
35          追加(I、A)、追加(I + 1、 - A)。
36      }
 37      ながら(M-- ){
 38          A = FR()。
39          であれば(== 1 ){
 40              B = frの()、C =用のFR()、Dは=のFR()。
41              追加(B、D)、追加(C + 1、 - D)。
42          }
 43          であれば(== 2 ){
 44              B =のFR()。
45              のprintf(" %LLDする\ n " 、尋ねる(B))。
46          }
 47      }
 48      リターン 0 49 }

 

おすすめ

転載: www.cnblogs.com/kanchuang/p/11200128.html