ツリーの会長(小区間kの数)

トピックへのリンク: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 }

 

おすすめ

転載: www.cnblogs.com/zxz666/p/11404113.html