問い合わせが解決するために小さなから大規模まで、オフラインで、バランスの取れたツリー千万人を設定し、大規模なk番目の問題を追求するために変換されます。
#include <ビット/ STDC ++。H> の#include <ビット/ EXTC ++。H> の#defineは LL長い長 の#define LD長い二 の#define ULL符号なし長い長 の#define第Fiの に#define SE第二 の#define MK make_pair の#define PLL対<LL、LL> の#define PLI対<LL、整数> の#define PII対<整数、整数> の#define SZ(X)((INT)x.size()) の#define ALL(X)(X).begin ()、(X).END() の#define FIO IOS :: sync_with_stdio(偽)。cin.tie(0)。使用して名前空間はstdを、 使用して名前空間の__gnu_pbdsを。 CONSTの INT N = 5E5 + 7 。 const int型 INF = 0x3f3f3f3f 。 constの LL INF = 0x3f3f3f3f3f3f3f3f 。 const int型のmod = 998244353 ; constの ダブル EPS = 1E- 8 ; CONST ダブル PI = ACOS( - 1 )。 テンプレート < クラス T、クラス S>インラインボイド追加(T&、S b)は{A + B =。もし(> = MOD)A - = MOD;} テンプレート < クラス T、クラスS>インラインボイドサブ(T&、S b)は、{ - = B。もし(< 0)、A + = MOD;} テンプレート < クラス T、クラス S>インラインBOOL chkmax(T&、S B)は{ 返す <bは?= B、真:偽;} テンプレート < クラス T、クラス S>インラインブール chkmin(T&、S b)は{ 返す > bは?A = B、真:偽;} テンプレート < クラス T> 使用ツリー=木<T、null_type、のstd ::以下<T>、rb_tree_tag、tree_order_statistics_node_update> ; ツリー < 整数 > BST; INTのN、M、Q。 PLLのQUS [N]。 PLL今[N]。 INT [N]。 INT CNT [N]。 INTのANS [N]。 INT メイン(){ scanf関数(" %D%D%D "、&N、&M&Q)。 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %dを"&[I])。 今[[i]は] Fiを提供しています。 ++ ; } 以下のために(int型 I = 1 ; I <= M; iは++)は[i]は.SE = I。 ソート(今 + 1、今+ 1 + M)。 以下のために(int型 I = 1 ; I <= Q; iは++ ){ scanf関数(" %のLLD "、&QUS [I] .fi)。 QUS [i]は.SE = I。 } ソート(QUS + 1、QUS + 1 + Q)。 LL予備 = 0 。 LL CNT = 0 。 LL TMP= N; 用(int型 I = 1、J = 1 ; I <= Q; iは++ ){ LLのK = QUS [I] .fi。 一方、(j <= M &&(今[J] .fi -予備)* CNT + TMP < K){ TMP + =(現在[J] .fi - PRE)* CNT。 CNT ++ ; bst.insert(今[J] .SE)。 前 = 今[J] .fi。 J ++ ; } LLニーズ = K - TMP。 LLのPOS =は%必要CNTを。 もし(POS)POS = * bst.find_by_order(POS - 1 )。 他の POS = * bst.find_by_order(CNT - 1 ); ANS [QUS [I] .SE] = POS。 } のための(int型 I = 1 ; I <= Q; iが++)のprintf(" %d個の\ n " 、ANS [I])。 リターン 0 ; } / * * /