#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 N = 100005 ; const int型 M = 100005 * 20 。 INTのルート[N]、LSONの【のM]、rson [M]、V [M]。 INT [N]、B [N]。 int型 TOT = 0 ; ベクトル < int型 > 対; マップ < int型、int型 > 融点; ボイドビルド(INT&X、int型の L、INT R){ X = ++ TOT。 //coutの<< X <<てendl; もし(L == R){V [X] = 0 ; 返します。} INT半ば=(L + R)/ 2 。 ビルド(LSON [x]は、L、MID)。 ビルド(rson [x]は、中間 + 1 、R)。 V [X] = Vの[のLSONの[X] + V [rsonの[X]]。 } ボイド更新(INT奇数、INT&X、int型の POS、int型の値、int型 L、int型R){ X = ++ TOT。V [X] = V [奇数] +値。LSON [X] = LSON [奇数]。rson [X] =のrson [奇数]。// 构链 場合(L == R){ 返します。} INT半ば=(L + R)/ 2 。 もし(MID> = POS)更新(LSON [奇数]、LSON [x]は、POS、値、L、MID)。 他の 更新(rson [奇数]、rson [x]は、POS、値、中間+ 1 、R)。 // V [X]のV [のLSON [X] + V = [rsonの【をX]]。 } int型の照会(INT奇数、int型のx、int型 K、int型の L、INT R){ int型 NUM = Vの[のLSONの[X]] - V [LSON [奇数]。 もし(L == R) 戻りL。 もし(K <= NUM)戻りクエリ(LSON [奇数]、LSON [X]、K、L、(L + R)/ 2 )。 他 戻りクエリ(rson [奇数]、rson [x]は、K-numが、(L + R)/ 2 + 1 、R)。 } int型のmain(){ int型の T。scanf関数(" %のD "、&T)。 一方、(T-- ){ int型 N、M。scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。 以下のために(int型 I = 1 iは= N <; I ++の)vs.push_back([I])。 ソート(vs.begin()、vs.end())。 vs.erase(ユニーク(vs.begin()、vs.end())、vs.end())。 以下のために(int型 i = 0 ; i)は(vs.sizeを<; I ++の)融点を[VS [I] = I + 1、B [I + 1 ] = VS [I]。 // (I = 0 int型私は++; iがvs.size()<)のために<< ENDL [[I] VS] COUT <<対[I] <<」「<<融点を、coutの<<てendl; INT NN = vs.size()。 ビルド(ルート[ 0 ]、1 、NN)。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ int型 POS =融点[I]]。 // coutの<< MP [[I]] <<てendl;1 ]、根[i]は、POS、、1 、NN)。 } のために(int型 I = 1 ; I <= M; iは++ ){ int型の L、R、K。scanf関数(" %D%D%D "、&L&R&K)。 INT ANS =クエリ(ルート1- [ 1 ]、根[R]、K、1 、NN)。 printf(" %Dを\ n " 、B [ANS])。 } vs.clear()。 mp.clear(); 以下のために(int型 i = 0 ; iが<= N; iは++)ルートを[I] = 0 ; TOT = 0 ; } }