トピックへのリンク:https://www.luogu.org/problem/P3834
その後、第1の離散、木テンプレートの会長。
1の#include <cstdioを> 2の#include <CStringの> 3の#include <アルゴリズム> 4 の#define半ば(L + R)/ 2 5 使用 名前空間STDを、 6 7 のconst int型 N = 200010 。 8 int型 N、Q、M、CNT = 0 。 9 INT [N]、B [N]、T [N]。 10 INTの和[N << 5 ]、L [N << 5 ]、R [N << 5 ]。 11 12インラインint型のビルド(int型 L、int型R) 13 { 14 INT RT = ++ CNT。 15 和[RT] = 0 。 16 であれば(L < R){ 17 L [RT] = ビルド(L、MID)。 18 R [RT] =ビルド(MID + 1 、R)。 19 } 20 リターンRT。 21 } 22 23インラインINTの更新(INTプリ、INT L、int型の R、INT X) 24 { 25 INT RT = ++ CNTと、 26 L [RT] = L [事前]。R [RT] R [事前]を=。和[RT] =和[事前] + 1 。 27 であれば(L < R){ 28 であれば(X <= MID)L [RT] = アップデート(L [事前]、L、中、X)。 29 他 R [RT] =アップデート(R [事前]、ミッド+ 1 、R、X)。 30 } 31 リターンRT。 32 } 33 34インラインINTクエリ(INT U、INT V、INTを L、int型の R、int型K) 35 { 36 場合(L> = R)リターンリットル; 37 INT X =和[L [V]] - 和[L [U]。 38 であれば(X> = k)の戻りクエリ(L [U]、L [V]、L、中、K)。 39 他 戻りクエリ(R [U]、R [V]、ミッド+ 1、R、K- X)。 40 } 41 42 のint main()の 43 { 44 のscanf(" %D%dの"、&N、&Q)。 45 のために(int型 i = 1 ; iが++; iが<= N ){ 46 のscanf(" %d個"、&[I])。 47件の B [I] = [I]。 48 } 49 ソート(B + 1、B + 1個の + N)。 50 、M =一意(B + 1、B + 1個の + N)-B- 1 。 51 T [ 0 ] =ビルド(1 、M)。 52 のために(int型 i = 1 ; iが<= N; iが++ ){ 53 INT T = LOWER_BOUND(B + 1、B + 1 + M、[I]) - B。 54 T [I] =アップデート(T [I- 1 ]、1、M、T)。 55 } 56 ながら(Q - ){ 57 のint X、Y、Z。 58 のscanf(" %D%D%D "、およびX&Y、およびZ)。 59 int型 T =クエリ(T [X- 1 ]、T [Y]、1 、M、Z)。 60 のprintf(" %d個の\ n " 、B [T])。 61 } 62 リターン 0 。 63 }