RT。
書式#include <iostreamの> の#include <cstdioを> に#define RレジスタのINT 使用して 名前空間はstdを、 インラインINT G(){ R RET = 0、=解決1。登録のchar chのを。しばらく(!isdigit(CH = getchar関数()))修正= CH == ' - ' - ?1 :修正します。 DO RET = RET * 10 +(CH ^ 48)。一方、(isdigit(CH = GETCHAR()))。リターンのRET *の修正。 } のconst int型 N = 100010はInf = 1E +7 + 10 。 構造体ノード{ int型 LS、RS、CNT;} T [N << 2 ]。 int型nは、TOT、室温; #define LS tは[TR] .ls の#define RS T [TR] .RS の#define CNT(X)T [X] .CNT インラインボイド追加(INT&TR、int型の L、INT R、INT VL、INT D) { 場合(!TR)TR = ++ TOT; もし(L == R){CNT(TR)+ = D。リターン ;} R MD = 1 + rを>> 1 。 もし(VL <= MD)(LS、L、MD、VL、D)を加えます。他に +(RS、MDを追加1、R、VL、D)。CNT(TR)= CNT(LS)+ CNT(RS)。 } インラインINTクエリ(INT TR、INT L、INT R、INT LL、INT RR){ 場合(!TR)戻り 0 ; もし(LL <= 1 && R <= RR)戻り CNT(TR)。R MD = L + R >> 1 RET = 0 。 もし(LL <= MD)RET + =クエリ(LS、L、MD、LL、RR)。もし(RR> MD)RET + =クエリ(RS、MD + 1、R、LL、RR)。リターンRET; } インラインINT getvl(INT TR、int型の L、INT R、INT RK){ 場合(L == R)戻り L。R MD = L + R >> 1 。 もし(CNT(LS)> = RK)戻り getvl(LS、L、MD、RK)。他 戻り getvl(RS、MD + 1、R、rk- CNT(LS))。 } インラインINT getrk(INT TR、INT L、INT R、INT VL){ 場合(!TR)戻り 0 ; もし(L == R)リターン 1。R MD = L + R >> 1 。 もし(VL <= MD)戻り getrk(LS、L、MD、VL)。他 戻り CNT(LS)+ getrk(RS、MD + 1 、R、VL) } インラインINT getpre(INT VL){RのRK =クエリ(1、-Inf、Infを、-Inf、VL- 1)。戻り getvl(1、 - Infを、Infを、RK);} インラインINT getnxt(INT VL){RのRK =クエリ(1、-Inf、Infを、-Inf、VL)+ 1。戻り getvl(1、 - Infを、Infの、rkが);} (){ 主署名さ JACK #ifdefの (freopenは"でNOIPAK ++。" " R 」、STDIN); #endifの N = G()のための(R I = 1 iが<= N; ++、OPであり、X I){ OP = G()、X = G (); 場合(オペアンプ== 1)(RT、-Inf、Infを、X、追加1 ;)そう であれば(オペアンプ== 2)を追加し(室温、-Inf、Infを、X - 1 )、 そう であれば(オペアンプ== 3)のprintf(" %d個の\ n "、getrk(1、 - Infを、Infの、X)); そうでない 場合(OP == 4)のprintf(" %Dを\ n "、getvl(1、 - Infを、Infの、X)); そう であれば(OPの== 5)のprintf(" %Dを\ n " 、getpre(X)); そう であれば(OP == 6)のprintf(" %d個の\ n " 、getnxt(X)); } }
2019年7月3日