トピックリンクします。https://www.luogu.org/problem/P3834
木の会長は、まだkの小さなセクションを求めて
書式#include <iostreamの> の#include <cstdioを> する#include <アルゴリズム> 使用して 名前空間はstdを、 #define MAXN 200005 の#defineっ長い長い INT T [MAXN * 20 ]、L [MAXN * 20 ]、R [MAXN * 20 ]、和[MAXN * 20 ]、TOT。 LL [MAXN]、B [MAXN]。 インラインINTの更新(INTプリ、int型の L、int型の R、INT X) { int型 RT = ++ TOT。 L [RT] = L [事前]。 R [RT] = R [事前]と、 和[RT] =和[事前] + 1 。 もし(L < R) { int型ミッド= L + R >> 1 。 もし(x <= MID)L [RT] = アップデート(L [事前]、L、中、X)。 他 R [RT] =アップデート(R [事前]、ミッド+ 1 、R、X)。 } 戻りRT; } インラインINTクエリ(INT U、INT V、INTを L、int型の R、int型K) { 場合(L> = R)戻りL。 INT X =和[L [V]] -和[L [U]、ミッド= L + R >> 1; もし(x> = k)の戻りクエリ(L [U]、L [V]、L、中、K)。 他 戻りクエリ(R [U]、R [V]、ミッド+ 1、R、K- X)。 } int型のmain() { int型、N M。 scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 i = 1 ; iが<= N; iが++ ) { scanf関数(" %のLLDを"&[I])。 B [i]は = [I]。 } ソート(B + 1、B + 1 +N); INT LEN =一意(B + 1、B + 1 + N)-B- 1 。 TOT = 0 ; 以下のために(int型 i = 1 ; iが<= N; iは++ ) { int型の POS = LOWER_BOUND(B + 1、B + 1 + LEN、[I]) - B。 T [I] =アップデート(T [I- 1 ]、1 、LEN、POS)。 } int型のL、R、K。 以下のために(int型 I = 1 ; I <= M iは++ ) { scanf関数(" %D%D%D"&L&R& K); のprintf(" %LLDする\ n "、B [クエリ(T 1- [ 1 ]、T [R]、1 、LEN、K)]); } 戻り 0 ; }