タイトル説明
[1]、[2]、[3] ... [n]はAのn個の数を含む配列が与えられると、問い合わせ手順に答える必要がありますで、I、J、K、所与のために[ i]は、[I + 1]、[I + 2] ...... k番目に小さい数の[j]が数(1≤k≤j-I + 1)であり、そしてあなたが数を変更することができます[ i]の値は、変更後に、プログラムは後で変更については、上記の質問に答えるために続けることができます。あなたは、一連の入力ファイルから読み込み、指示や変更指示の尋問を含む一連の命令を、読み込み、このようなプログラムをコンパイルする必要があります。
各クエリコマンドに対して、あなたは出力正しい答えをする必要があります。
入力形式
最初の行は2つの正の整数N(1≤n≤100000)、M(1≤m≤100000)を有しています。それぞれの命令シーケンスの数と長さを表します。
第二列は、[1]、[2] ... [n]を表し、これらの数字は9 ^ 10未満で、数nを有します。各命令m行の以下の説明は、各行の形式は、二つの形式のいずれかです。QのIJKまたはCそれ
-
QのIJKは(iは、kは数、1≤i≤j≤n、1≤k≤j-I + 1 Jである)を問い合わせる問合せコマンドを表す[I]、[I + 1] ... [Jの小さなk]の数。
-
C(1≤i≤n、^ 90≤t≤10)は[i]を変更Tになる表します。
出力フォーマット
各プロンプトについて、あなたは彼の出力、別々の行に各出力に答える必要があります。
サンプル入力と出力
5 3 3 2 1 4 7 Q 1 4 3 C 2 6 Q 2 5 3
3 6
説明/ヒント
データの10%、M、n≤100。
データの20%、M、n≤1000。
データの50%、M、n≤10000。
すべてのデータ、M、n≤100000用
定数の最適化が、全体的に通常の書き込みバイナリツリーとツリーは各点の1000msの周りの時間をかけて設定することができますことに注意してください。
出典:bzoj1901
質問の意味:修理と会長ツリー
会長共通ツリーのメンテナンスは、アップデートのプレフィックスとプレフィックスのシーケンスであり、最も簡単な1-iと
あなたは暴力の複雑さの言葉がよりnとするならば、木の会長に続いて、i番目の変更が修正されなければならないようにしたい場合
接頭フェンウィックツリーログを維持することができるし、
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 // BXDによる入力 の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT) の#defineためreppを(I、B)(I =(A int型); I> =(B); - I) の#defineが長い長いちゃう の#define(X)(CERR <<(#xを)参照<< '=' <<(X)<< ENDL) の#define PB一back #define INF 0x3f3f3f3f の#define CLR(A、V)のmemset(A、V、Aはsizeof) のtypedef対 < INT、INT > PII。 ///////////////////////////////// / CONSTの INT N = 2E5 + 10 。 INT T [N]、T [N <5 ]、LSON [N << 5 ]、rson [N << 5 ]、NCNT、cntpre、cntpos、XX [N]、YY [N]。 無効アップ(int型のx、int型の L、int型の R、INTプリ、INT&POS、INT V) { POS = ++ NCNT。 LSON [POS] = LSON [事前]; rson [POS] [事前] =のrson; T [POS] = tの[事前] + Vと、 もし(L == R)のリターン ; INT、M =(L + R)>> 1 。 もし(x <= M)アップ(X、L、M、LSON [事前]、LSON [POS]、V)。 他のアップ(X、M + 1 、R、rson [事前]、rson [POS]、V)。 } INTqsum(INT K、int型の L、INT R) { 場合(L == R)戻りL。 INT X = 0 。 担当者(I、1、cntpre)X- = T [LSON [XXの[I]]]。 担当者(I、1、cntpos)X + = T [LSON [YYの[I]]]。 INT、M =(L + R)>> 1 。 もし(K <= X) { 担当者(I、1、cntpre)XX [I] = LSONの[xxの[I]]。 担当者(I、1、cntpos)YYの[I] = LSON [YY [I]]。 qsum(K、L、M)。 } 他 { 担当者(I、1、cntpre)XX [I] =のrson [XX [I]]。 担当者(I、1、cntpos)YY [I] =のrson [YY [I]]。 qsum(k個の -X、M + 1 、R)。 } } INT [N]、B [N]、NN、N、M、CA [N]、CB [N]、CC [N]。 チャー S [ 2 ]。 INT追加(int型のx、int型V) { int型 K = LOWER_BOUND(B + 1、B + 1 + nnは、[X]) - B。 以下のために(int型 I = xをI + = I&-i; iが<= n)がアップ(K、1 、NN、T [i]は、T [i]は、V)。 } INT メイン() { scanf関数(" %d個の%のD "、&N、&M)。 担当者(I、1、N)のscanf(" %dの"、および[I])、[I] = B [i]は、NN = N。 担当者(I、1 、M) { scanf関数(" %sの"、S); scanf関数(" %d個の%のD "、およびCA [i]は、&CB [I])。 もし(S [ 0 ] == ' Q ')のscanf(" %dの"、&CC [I])。 他の B [++ NN] = CB [i]は、 ソート(B 1、B + 1 + NN)。 NN =一意(B + 1、B + 1 + NN)-B- 1 。 担当者(I、1、n)の追加(I、1 )。 担当者(I、1 、M) { 場合(CC [I]) { cntpre = cntpos = 0 。 用(INT J = CA [1] - 1 ; J; J = = J&-j)XX [++ cntpre] = T [J]。 用(INT J = CB [I]; J; J = = J&-j)YY [++ cntpos] = T [J]。 printf("%d個の\ nを "、B [qsum(CC [i]は、1 、NN)]); } そうでなければ、[I](CAを追加- 1)、[CA [I] = CB [i]は、追加( CA [i]が、1 ); } 戻り 0 ; }