タイトル説明
あなたは、次を提供する必要がある番号の一部を維持するために、(タイトルの主題を参照)のデータ構造を記述する必要があります。
- 挿入のx 数xを
- 削除X-に(複数の場合にのみ削除するので、同じ番号)X-数
- クエリーXのランク数X(ランク数を現在の数の数の比として定義される小+ 1 + 1の場合、複数の同じ数、最小出力ランクため)
- ランク付けされたクエリのx 数x
- シークX X前駆体(未満として定義前駆X X、および最大数)
- シークX Xの(後続よりも大きいとして定義後継XのX、最小数)
入力形式
最初の行のn 数n、操作、次のnはn行それぞれが持っている二つの数字が選ぶO P T及びX 、Xは、オプトO P Tは、操作のシリアル番号(表わす 。1 \のLeq OPT \ 1当量6 。1 ≤ O P T ≤ 6)
出力フォーマット
動作のため3,4,5,6- 3 、4 、5 、6行あたりの出力数、それに対応する回答を示し
サンプル入力と出力
入力#1
10 1 106465 4 1 1 317721 1 460929 1 644985 1 84185 1 89851 6 81968 1 492737 5 493598
出力#1
コードの表示
106465の 84185 492 737
バランスウェイトテンプレートツリーのメンテナンスの問題
#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 = 2E6 + 10 。 int型の息子[N] [2 ]、FA [N]、SIZ [N]、CNT [N]、ヴァル[N]、NCNT、ルート。 INT CHK(INT X) { 戻り息子[FA [X]] [ 1 ] == X。 } ボイドアップ(INT X) { SIZ [X] = SIZ [息子[X] [ 0 ]] + SIZ [息子[X] [ 1 ] + CNT [X]。 } ボイド回転(INT X) { int型、Y = FA [X]、Z = FA [Y]、K = CHK(x)は、W =息子[X] [K ^ 1 ]。 息子[Y] [K] = W; FA = [W] Y。 息子[Z] [CHK(Y)] = xと; FA [X] = Z; 息子[X] [K ^ 1] = Y; FA [Y] =のX。 アップ(x)は、アップ(Y)。 } ボイドスプレイ(int型のx、int型ゴール= 0 ) { ながら(!FA [X] = 目標) { int型、Y = FA [X]、Z = FA [Y]。 もし(Z =!目標) { 場合(CHK(Y)== CHK(Z))(y)を回転させます。 他の回転(x)は、 } 回転(X) } もし(!ゴール)ルート=のX; } 空のfind(int型x)は { 場合(!ルート)のリターン; int型の POS = ルート。 一方、(息子[POS] [X>ヴァル[POS] && X =!ヴァル[POS]) POS =息子[POS] [X> ヴァル[POS]。 スプレイ(POS)。 } ボイドインサート(INT X) { int型の POS =ルート、P = 0 。 一方(POS &&ヴァル[POS] =!X) { P = POS。 POS =息子[POS] [X> ヴァル[POS]。 } であれば(POS)CNT [POS] ++ ; 他の { POS = ++ NCNT。 もし(P)息子[P] [X>ヴァル[P] = POS。 息子[POS] [ 0 ] =息子[POS] [ 1 ] = 0 。 ヴァル[POS] = xと; FAは[posが= P。 CNT [POS] = SIZ [POS] = 1 。 } スプレイ(POS)。 } INT k番目(INT K) { int型の POS = ルート。 一方、(1 ) { 場合(息子[POS] [ 0 ] && SIZ [息子[POS] [ 0 ]> = K) POS =息子[POS] [ 0 ]。 それ以外の 場合(K> SIZ [息子[POS] [ 0 ] + CNT [POS]) K - = SIZ [息子[POS] [ 0 ] + CNT [POS]、POS =息子[POS] [ 1 ]。 他 {スプレイ(POS)。戻りPOSを;} } } int型のプレ(INT X) { (x)を見つけます。 もし(ヴァル[ルート<x)の戻りルート。 int型 POS =息子[ルート] [ 0 ]; 一方、(息子[POS] [ 1 ])POS =息子[POS] [ 1 ]。 スプレイ(POS)。返すPOSを。 } int型の SUCC(INTX) { (x)を求めます。 もし(ヴァル[ルート]> x)の戻りルート。 int型 POS =息子[ルート] [ 1 ]; 一方、(息子[POS] [ 0 ])POS =息子[POS] [ 0 ]。 スプレイ(POS)。返すPOSを。 } ボイド削除(INT X) { int型最後=プレ(X)、NEX = SUCC(X)。 スプレイ(最後);スプレイ(NEX、最後の); int型 POS =息子[NEX] [ 0 ]; もし(CNT [POS]> 1 ) { CNT [POS] - スプレイ(POS); } さもなければ息子[NEX] [ 0 ] = 0 。 アップ(ルート);アップ(NEX)。 } ボイドランク-1(INT X) { (x)を見つけます。 もし(ヴァル[ルート<= X)のprintf(" %d個の\ n "、SIZ [息子[ルート] [ 0 ]])。 そう であれば(ヴァル[ルート]> X)のprintf(" %d個の\ n "、SIZ [息子[ルート] [ 0 ] + CNT [ルート])。 INT のmain() { int型の M; CIN >> M。int型、B; (挿入0x3f3f3f3f )。 (挿入0xcfcfcfcf); 一方、(M-- ) { scanf関数(" %D%dの"、&、&B)。 もし(== 1 )(b)の挿入; 場合(== 2 )を除去(B) もし(== 3 )ランク-1(B) もし(== 4)のprintf(" %d個の\ n "、ヴァル[k番目(B + 1 )])。 もし(== 5)のprintf(" %d個の\ n " 、ヴァル[プレ(B)])。 もし(== 6)のprintf("%d個の\ n "、ヴァル[SUCC(B)])。 } 戻り 0 。 }