P3374フェンウィックツリー1(シングルポイント修飾合計)

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型のインデックス)
{ 
    ツリー[インデックス] .nu​​m =ツリー[索引<< 1] .nu​​m +ツリー[インデックス<< 1 | 1 ] .nu​​m。
} 

ボイドビルド(int型 L、int型の R、int型のインデックス)
{ 
    ツリー[インデックス] .LEFT = L。
    ツリー[インデックス] .RIGHT = R。
    もし(L == R)
    { 
        ツリー[インデックス] .nu​​m = 入力[L]。
        返します
    } 
    INT半ば=(L + R)>> 1 
    構築(リットル、ミッド、インデックス << 1 )。
    構築(ミッド + 1、R、インデックス<< 1 |1 ); 
    突き上げ(インデックス)。
} 

ボイド変化(int型のインデックス、INT DIS、int型K)
{ 
    場合(ツリー[インデックス] .LEFT == ツリー[インデックス] .RIGHT)
    { 
        ツリー[インデックス] .nu​​m + = K。
        返します
    } 
    であれば(DIS <=ツリー[索引<< 1 ] .RIGHT)
        変化(インデックス << 1 、DIS、K)。
    それ以外の
        変更(インデックス << 1 | 1 、DIS、K); 
    突き上げ(インデックス)。
} 
無効検索(int型インデックス、int型の L、INT R)
{ 
    場合(L <=ツリー[インデックス] .LEFT && R> = ツリー[インデックス] .RIGHT)
    { 
        ANS + = ツリー[インデックス] .nu​​m。
        返します
    } 
    もし(ツリー[索引<< 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 
}

 

おすすめ

転載: www.cnblogs.com/Vampire6/p/11456583.html