Succinct Data Structures for Segments
Abstract
We consider succinct data structures for representing a set of horizontal line segments in the plane given in rank space to support segment access, segment selection, and segment rank queries. A segment access query finds the segment given its -coordinate (-coordinates of the segments are distinct), a segment selection query finds the th smallest segment (the segment with the th smallest -coordinate) among the segments crossing the vertical line for a given -coordinate, and a segment rank query finds the number of segments crossing the vertical line through -coordinate with -coordinate at most , for a given and . This problem is a central component in compressed data structures for persistent strings supporting random access.
Our main result is a data structure using bits of space and query time for all operations. We show that this space bound is optimal up to lower-order terms. We will also show that the query time for segment rank is optimal. The query time for segment selection is also optimal by a previous bound.
To obtain our results, we present a novel segment wavelet tree data structure of independent interest. This structure is inspired by and extends the classic wavelet tree for sequences. This leads to a simple, succinct solution with query times. We then extend this solution to obtain optimal query time. Our space lower bound follows from a simple counting argument, and our lower bound for segment rank is obtained by a reduction from 2-dimensional counting.
Keywords and phrases:
Succinct, Data structures, SelectionFunding:
Philip Bille: Danish Research Council grant DFF-8021-002498.Copyright and License:
![[Uncaptioned image]](x1.png)
2012 ACM Subject Classification:
Theory of computation Data structures design and analysisEditors:
Paola Bonizzoni and Veli MäkinenSeries and Publisher:

1 Introduction
Let be a set of horizontal line segments in rank space, that is, the line segments are in the plane such that there is exactly one endpoint on each -coordinate and one segment on each -coordinate. The segment representation problem is to preprocess to support the operations:
-
: return the segment with -coordinate .
-
: return the -coordinate of the th smallest segment (the segment with the th smallest -coordinate) among the segments crossing the vertical line through -coordinate .
-
: return the number of segments crossing the vertical line through -coordinate with -coordinate at most .
Here, we consider a segment to be crossing the vertical line through -coordinate iff . The segment representation problem in which the endpoints are real numbers can be reduced to the rank space variant using standard techniques [7]. Bille and Gørtz [2] considered representing segments to support segment selection queries in connection with compressed data structures for persistent strings. Here, the problem is supporting random access on a set of strings represented by a version tree, where each edge represents a replace, insert, or delete operation on the string represented by the parent node. They showed that this problem can be reduced to answering segment selection queries on horizontal line segments. They gave a data structure supporting segment selection queries using bits of space and query time111We denote .. Furthermore, they showed that time is required to answer segment selection queries for any static data structure using bits of space.
1.1 Results
This paper considers succinct data structures for the segment representation problem. We show the following main result on a standard unit cost word RAM model with logarithmic word size.
Theorem 1.
Given a set of horizontal line segments, we can solve the segment representation problem using bits of space and time for all queries.
Compared to previous results of Bille and Gørtz [2], Theorem 1 improves the space bounds from to . At the same time, we obtain the optimal query time for segment selection and implement the segment rank query in the same time. Furthermore, we show that the space bound of Theorem 1 is optimal up to lower order terms.
Theorem 2.
Any data structure representing horizontal line segments requires at least bits.
Finally, we show that the query time for segment rank is also optimal.
Theorem 3.
Any static data structure on horizontal line segments that uses bits of space needs time to support segment rank queries.
1.2 Techniques
We obtain our results by first considering a novel and simple structure, the segment wavelet tree, which may be of independent interest. The segment wavelet tree is inspired by the classical wavelet tree structure of Grossi et al. [9], and builds on the observation that the number of segments crossing a vertical line is the difference between the number of left and right endpoints occurring before said line. In the same manner, as the wavelet tree recursively splits the alphabet in its lower and upper half, the segment wavelet tree recursively splits the segments in the lower and upper half of the plane. Because of this, the segment wavelet tree can be used to search for the th segment crossing a vertical line. The segment wavelet tree, however, only achieves query time since it only splits the plane into horizontal bands. In order to speed up the query to we generalize the segment wavelet tree to the -ary segment wavelet tree, which splits the plane into horizontal bands called slabs, leading to Theorem 1. Next, we prove the information-theoretical lower bound of representing horizontal line segments by showing that in rank space, we need at least bits of space to represent horizontal line segments. Finally, we prove a matching lower bound for the segment rank query on horizontal line segments by showing that any static solution using bits of space needs query time. To do so, we show a reduction from 2-dimensional dominance counting [19].
1.3 Related Work
Queries on Intervals.
There exists a related problem called the stabbing-semigroup problem. The stabbing-semigroup problem is to preprocess a set of intervals where each interval has an associated weight, such that given an integer , we can compute the sum of weights of the intervals containing . Agarwal et al. [1] showed how to solve the stabbing-semigroup problem in bits of space and query time. They also showed how to make the structure dynamic, allowing adding and removing intervals in time and how it can be adapted to work in external memory. Another related query on intervals is the stabbing-max, which is the problem of finding the interval of maximum weight containing . Nekrich [18] described a dynamic data structure that answers one-dimensional stabbing-max queries in optimal time using bits and allows insertions and deletions of intervals in time. To the best of our knowledge, neither of these problems has been considered in a succinct setting.
Succinct Data Structures.
Many geometric queries on two-dimensional points have been considered in a succinct setting, including orthogonal range reporting and counting [5, 14, 16], point location [3, 11] and data-analysis queries [17] (see also the survey by He [10]). We extend this line of research by considering horizontal line segments in a succinct setting.
2-Dimensional Dominance Counting.
The 2-dimensional dominance counting problem is to preprocess points, such that given a point , we can compute the number of points where and . The can also be viewed as two -dimensional dominance counting queries by observing that the number of segments crossing the vertical line through -coordinate with -coordinate at most is the difference in the number of left and right endpoints dominating . Bose et al. [4] showed that we can answer 2-dimensional dominance counting queries in time using space, when the points are in rank space. Thus, we can achieve the same results for segment rank queries as in Theorem 1 using two 2-dimensional dominance counting structures. However, this leaves out how to answer segment access and selection queries.
Range Selection.
The range selection problem is to preprocess an array of unique integers, such that given a query , one can report the th smallest integer in the subarray . A slight variation of the range selection problem is the prefix selection problem, which fixates in the query. Due to Jørgensen and Larsen [15], the prefix selection problem can be solved in bits and query time with matching lower bounds. Bille and Gørtz [2] showed the similarity between prefix selection and segment selection by proving that time is required to answer segment selection queries for any static data structure using space, by reduction from prefix selection.
1.4 Outline
We present the required preliminaries for our solution in Section 2, and then we describe a simple structure in Section 3 and how we can answer segment rank and select queries with this structure. We then show our structure in Section 4 and how we answer rank and select queries succinctly in time leading to Theorem 1. Finally, we prove the space lower bounds for representing segments in rank space leading to Theorem 2 and prove the lower bounds for segment rank queries leading to Theorem 3 in Section 5.
2 Preliminaries
For a given problem with instances, we need bits to distinguish between each instance in the worst case. We say a data structure representing is compact if it uses bits of space and is succinct if it uses bits of space [13].
2.1 Succinct Representations of Strings
Let be a string of characters from an alphabet and define the following operations.
-
return .
-
return the number of occurrences of character in .
-
return the position in of the th occurrence of character .
For binary strings, we use the following well-known result:
Lemma 4 ([12]).
We can represent a bit string of length using bits and support access, rank, and select queries in constant time.
Wavelet Tree.
A wavelet tree [9] for a string is a complete balanced binary tree with leaves. Each node in represents the characters in . The root represents the full alphabet and for any non-leaf node with alphabet the left child represents the lower half of , i.e., , and the right child the upper half of , i.e., . Furthermore, for any leaf node , we have . For a node let be restricted to the characters . Each internal node with left child and right child stores a bitstring such that if and otherwise ().
With the bit string we can track which child of will contain each element , by observing that child , where , will contain element iff . If then will be stored at where index is the number of occurrences of in since each occurrence of is an element in that would also be in and would be in the same order as they appear in . This is exactly the rank operation on bit strings, thus . With this property, we can navigate downwards in the wavelet tree. We can also use the bit string together with select to navigate upwards in the wavelet tree. Let be a child of . Then the index that the symbol occurs in is the index of the th in which is . The following lemma captures these properties:
Lemma 5.
Let be a non-leaf node in a wavelet tree. Given an index then is the greatest index in the bit string of the child such that . In particular, if then .
This follows from the duality of rank and select and the observations made above. Using Lemma 4 to represent the bit strings of each node one can implement a wavelet tree for a sequence over the alphabet using bits of space and query time for rank, select, and access [16]. A more recent result shows the following:
Lemma 6 ([8]).
The wavelet tree for a sequence over the alphabet uses bits of space and query time for rank, select, and access.
3 Segment Wavelet Tree
Here, we present a simple succinct solution to the segment representation problem with the following bounds.
Theorem 7.
Given a set of horizontal line segments in the plane , we can solve the segment representation problem succinctly in bits and time for all queries.
We will begin by describing the content of our data structure and then show how we can answer queries using this structure.
3.1 Data Structure
Let be a set of horizontal line segments in rank space. We define the segment wavelet tree as a recursive decomposition of the line segments in similar to the wavelet tree. For simplicity, we assume that is a power of . Define to be the segments with -coordinate in . The segment wavelet tree for is a complete balanced binary tree on leaves. Each node represents a set of segments . The root represents . Let be an internal node representing the segments , and let and be the left and right child of , respectively. Then represents the segments and represents the segments . A leaf node represents a single segment .
We store the segment wavelet tree succinctly as follows. Each internal node stores two bitstrings and of length .
Furthermore, we store a bitstring where
See Figure 1 for an example.
Alternatively, one can also view the segment wavelet tree as two superimposed wavelet trees of the strings and , where and are the strings of -coordinates of the left and right endpoints, respectively, ordered by increasing -coordinate.
To achieve the desired space bounds, we store and as their superimposed wavelet trees and according to Lemma 6 and the bitstring according to Lemma 4.
Analysis.
3.2 Segment Access Queries
We now show how to answer segment-access queries in time. To answer a query, we do a bottom-up traversal of the segment wavelet tree starting at the th leaf in the left-to-right order. Let denote the segment we are searching for. At each node in the traversal we maintain the following local variables:
We perform the traversal as follows. Initially, is the th leaf and . Consider a non-root node with parent and let if is the left child of and otherwise. We compute and . When we reach the root we compute and . Finally, we return .
Analysis.
We use constant time at each node, and we visit one node at each level of the segment wavelet tree. Since the height of is , the total time is .
Correctness.
Let be the segment with -coordinate . We show inductively that and are computed correctly for each on the path in the bottom-up traversal. When is the th leaf we have and thus and . Consider an internal non-root node . Assume and and are correct. Let be the parent of and if is the left child of and otherwise. The bitstrings and are in every index corresponding to a segment in . Thus is the number of segments in whose left endpoint has -coordinate at most , and is the number of segments in whose right endpoint has -coordinate at most . Let be the root. Since are and in every index corresponding to a left and right segment endpoint, respectively, we have and .
3.3 Segment Select Queries
We now show how to answer segment-select queries in time. To answer a query, we do a top-down traversal in the segment wavelet tree starting at the root and ending in the leaf containing the th crossing segment of the vertical line at time .
At each node with in the traversal we maintain the following local variables:
the number of segments in whose left endpoint has -coordinate at most . | |||
the number of segments in whose right endpoint has -coordinate at most . | |||
the number of segments in crossing the vertical line at . | |||
, such that the th segment in crossing the vertical line at | |||
is the th segment in crossing the vertical line at . |
We perform the traversal as follows. Initially, is the root and we have , and . Consider an internal node with children and and suppose we have computed , , and . We first compute the number of segments in crossing the vertical line at as
That is, is computed as the number of left endpoints of segments in with -coordinate at most subtracted by the number of right endpoints in with -coordinate at most .
We continue the traversal in child , where if and otherwise.
We then compute the local variables for the child as
When is a leaf and we return .
Analysis.
We use constant time at each node and visit one node at each level of the segment wavelet tree. Since the height of is , the total time is .
Correctness.
Let be the th smallest segment crossing the vertical line at . We show inductively, that and , , , and are computed correctly for each on the path in the top-down traversal.
When is the root we have and and . By definition, we have is the number of segments in whose right endpoint has -coordinate at most . Then, is the number of segments in whose left endpoint has -coordinate at most .
Consider an internal non-root node . Assume and that , , , and are correct. Let be the child of computed by the algorithm. The bitstrings and are in every index corresponding to a segment in . Thus is the number of segments crossing the vertical line at in . The set contains the lower half of the segments in . Thus if then , and . Otherwise, , and . It follows that we continue the traversal in the correct child . By definition of and it follows that , and are computed correctly.
3.4 Segment Rank Queries
We now show how to answer segment-rank queries in time. To answer a we perform a top-down traversal in the segment wavelet tree starting at the root and ending in the leaf such that . At each node in the traversal we compute the local variables , and in the same manner as in Section 3.3. We perform the traversal as follows. Consider an internal node with and children and , we continue the traversal in child , where if and otherwise. When is a leaf we return .
Analysis.
We use constant time at each node, and we visit one node at each level of the segment wavelet tree. Since the height of is , the total time is .
Correctness.
The correctness follows immediately from the correctness argument in Section 3.3 and the definition of , and .
In summary, we have shown Theorem 7.
4 Generalized Segment Wavelet Tree
Here, we generalize the solution in Section 3 to a tree of out-degree , where . To increase the out-degree to , we first consider the required data structure to partition the segments into horizontal bands called slabs. Afterward, we will describe the content of our data structure and show how we can answer queries using this structure.
4.1 Succinct Slab Representation
Let be a set of horizontal line segments partitioned into slabs of approximately equal size, where . The slab representation problem is to preprocess to support the operations:
-
: return the slab containing the th segment in according to increasing -coordinate among the segments crossing the vertical line through -coordinate .
-
: return the number of segments in crossing the vertical line through -coordinate in slabs .
-
: return the -coordinate of the th endpoint in in the th slab according to increasing -coordinate among the segments.
-
: return the number of endpoints in in the th slab who has a -coordinate of at most .
In [2] they show that slab-select and slab-rank can be done in space and constant query time using preprocessing time. We show how to modify this result and the analysis to achieve bits of space while maintaining constant query time.
Lemma 8.
Given a set of horizontal line segments, partitioned into horizontal slabs for , we can solve the slab representation problem in bits of space and time for all queries.
Proof.
In [2] they partition the sequence of segment endpoints into blocks, which are further partitioned into cells. Their data structure consists of the following components.
-
1.
A predecessor data structure for each block.
-
2.
The first column of each cell.
-
3.
The sequence of slab indices each endpoint belongs to, ordered by increasing -coordinate.
-
4.
A global table for tabulating queries inside the cells.
We modify the block width to be instead of , for another parameter . This also sets the cell width to . Plugging into their analysis, this implies the following space bounds.
-
1.
The predecessor structure uses space for each block. The number of blocks is , hence the space required is .
-
2.
Each entry of the first column of a cell can be encoded in . The combined height of all cells is and thus the combined space is .
-
3.
The sequence contains endpoints, and each endpoint can be encoded in bits, thus the entire sequence uses space.
-
4.
The global table has size .
In total, the data structure uses space and the same preprocessing time. Using standard techniques [6], we can also support select and rank on the sequence of endpoints in constant time using extra space. Since the sequence of endpoints is ordered by increasing -coordinate select and rank are equivalent with endpoint-select and endpoint-rank, respectively.
4.2 Data Structure
Let be a set of horizontal line segments in rank space. We define the -ary segment wavelet tree as a recursive decomposition of the line segments in similar to the -ary wavelet tree. For simplicity, we assume that is a power of . Define to be the segments with -coordinate in . The -ary segment wavelet tree for is a complete balanced tree on leaves. Each node represents a set of segments . The root represents . Let be an internal node representing the segments , and let be the children of . Then represents the segments . A leaf node represents a single segment . We store the -ary segment wavelet tree succinctly as follows. Intuitively, each internal node stores the structure of Lemma 8, but to achieve the desired space complexity, we instead, for each level in the -ary segment wavelet tree, concatenate the segments of the nodes on that level into one single structure of Lemma 8, as in [16]. Since there is exactly one segment of each coordinate, we can easily maintain the indices into the single structure corresponding to each node. When is not a power of , we pack the segments such that all levels in are complete except possibly the lowest, which is filled from the left. We then store the path along with indices to the rightmost leaf on the lowest level. This allows us to compute the indices into the single structure of each level.
Analysis.
Each level of the tree contains all the segments and thus uses bits of space by Lemma 8. Since the height of this tree is the entire data structure uses bits of space and preprocessing time.
4.3 Segment Access Queries
We now show how to answer segment-access queries in time. To answer a query, we first compute the path to the th leaf in the left-to-right order. We can trivially compute the path by performing a top-down traversal of the -ary segment wavelet tree starting at the root and ending in the th leaf. We then do a bottom-up traversal of the -ary segment wavelet tree starting at the th leaf. Let denote the segment we are searching for. At each node in the traversal we maintain the following local variables:
We perform the traversal as follows. Initially, is the th leaf and and . Consider a non-root node with parent and let be the th child of . We compute and . When we reach the root we return .
Analysis.
We use constant time at each node and visit one node at each level of the -ary segment wavelet tree. Since the height of is , the total time is .
Correctness.
Let be the segment with -coordinate . We show inductively that and are computed correctly for each on the path in the bottom-up traversal. When is the th leaf we have and thus and . Consider an internal non-root node . Assume and and are correct. Let be the parent of and let be the th child of . The segments in are in slab of . Thus by the definition of endpoint-select is the number of endpoints in who has -coordinate at most and is the number of endpoints in who has -coordinate at most . When we arrive at the root we have and .
4.4 Segment Select Queries
We now show how to answer segment-select queries in time. To answer a query, we do a top-down traversal in the -ary segment wavelet tree starting at the root and ending in the leaf containing the th crossing segment of the vertical line at time .
At each node with in the traversal we maintain the following local variables:
the number of endpoints in who has -coordinate at most . | |||
the number of segments in crossing the vertical line at . | |||
, such that the th segment in crossing the vertical line at | |||
is the th segment in crossing the vertical line at . |
We perform the traversal as follows. Initially, is the root and we have , and . Consider an internal node with children and suppose we have computed , , and . We compute the child containing the th segment crossing the vertical line at as
We then compute the local variables for the child as
When is a leaf and we return .
Analysis.
We use constant time at each node and visit one node at each level of the -ary segment wavelet tree. Since the height of is , the total time is .
Correctness.
Let be the th smallest segment crossing the vertical line at . We show inductively that and , , and are computed correctly for each on the path in the top-down traversal.
When is the root we have and and . By definition, we have is the number of endpoints in with -coordinate at most .
Consider an internal non-root node . Assume and that , , and are correct. Let be the child of computed by the algorithm. The segments in are in slab of . By the definition of slab-select the th segment crossing the vertical line at is . Furthermore by the definition is the number of segments crossing the vertical line at in and is the number of endpoints in who has -coordinate at most . Hence and .
4.5 Segment Rank Queries
We now show how to answer segment-rank queries in time. To answer a , we perform a top-down traversal in the segment wavelet tree starting at the root and ending in the leaf such that . At each node with in the traversal, we compute the local variables , and in the same manner as in Section 4.4. We perform the traversal as follows. Consider an internal node with and children . we continue the traversal in child , where . When is a leaf we return if and otherwise.
Analysis.
We use constant time at each node and visit one node at each level of the segment wavelet tree. Since the height of is , the total time is .
Correctness.
The correctness follows immediately from the correctness argument in Section 4.4 and the definition of , and slab-rank.
In summary, we achieve Theorem 1.
5 Lower Bounds
5.1 Horizontal Line Segments in Rank Space
Here, we show Theorem 2. Let be a set of horizontal line segments in rank space on the plane such that there is exactly one endpoint on each -coordinate and one segment on each -coordinate. If we only consider the -coordinates of the left and right endpoint of each segment, then the number of ways to arrange pairs of endpoints is the number of ways that we can pair elements.
Since each segment has a unique -coordinate, the number of ways the segments can be arranged on the -axis is . Thus, the number of ways to arrange segments in rank space is . Thus to distinguish between each instance we need bits. In summary, we have shown Theorem 2.
5.2 Segment Rank in Rank Space
Here, we show Theorem 3. We reduce from 2-dimensional dominance counting. The 2-dimensional dominance counting problem is to preprocess points from rank space, such that given a point compute the number of points such that and .
Lemma 9 ([19]).
Any static data structure on points that uses bits of space requires time to support dominance counting queries.
Given points to the 2-dimensional dominance counting problem, we construct an instance of the segment representation problem. We assume wlog. that these points are in rank space on the plane such that there is exactly one point on each and coordinate. To see why this assumption is acceptable to establish the lower bound, we refer to the discussion by Pătrașcu [19]. We construct the segments as follows: For each point we construct the corresponding segment such that the left endpoint is and the right endpoint is for . For a given query point , we count the number of points such that and by performing the query . Since no segment ends before -coordinate , the number of segments crossing the vertical line through -coordinate with -coordinate in are the segments with left endpoints such that and . In summary, we have shown Theorem 3.
References
- [1] Pankaj K. Agarwal, Lars Arge, Haim Kaplan, Eyal Molad, Robert Endre Tarjan, and Ke Yi. An optimal dynamic data structure for stabbing-semigroup queries. SIAM J. Comput., 41(1):104–127, 2012. doi:10.1137/10078791X.
- [2] Philip Bille and Inge Li Gørtz. Random access in persistent strings and segment selection. Theory Comput. Syst., 67(4):694–713, 2023. doi:10.1007/s00224-022-10109-5.
- [3] Prosenjit Bose, Eric Y. Chen, Meng He, Anil Maheshwari, and Pat Morin. Succinct geometric indexes supporting point location queries. ACM Trans. Algorithms, 8(2):10:1–10:26, 2012. doi:10.1145/2151171.2151173.
- [4] Prosenjit Bose, Meng He, Anil Maheshwari, and Pat Morin. Succinct orthogonal range search structures on a grid with applications to text indexing. In Frank K. H. A. Dehne, Marina L. Gavrilova, Jörg-Rüdiger Sack, and Csaba D. Tóth, editors, Algorithms and Data Structures, 11th International Symposium, WADS 2009, Banff, Canada, August 21-23, 2009. Proceedings, volume 5664 of Lecture Notes in Computer Science, pages 98–109. Springer, 2009. doi:10.1007/978-3-642-03367-4_9.
- [5] Bernard Chazelle. A functional approach to data structures and its use in multidimensional searching. SIAM J. Comput., 17(3):427–462, 1988. doi:10.1137/0217026.
- [6] Paolo Ferragina, Giovanni Manzini, Veli Mäkinen, and Gonzalo Navarro. Compressed representations of sequences and full-text indexes. ACM Trans. Algorithms, 3(2):20, 2007. doi:10.1145/1240233.1240243.
- [7] Harold N Gabow, Jon Louis Bentley, and Robert E Tarjan. Scaling and related techniques for geometry problems. In Proceedings of the sixteenth annual ACM symposium on Theory of computing, pages 135–143, 1984.
- [8] Alexander Golynski, Roberto Grossi, Ankur Gupta, Rajeev Raman, and S. Srinivasa Rao. On the size of succinct indices. In Lars Arge, Michael Hoffmann, and Emo Welzl, editors, Algorithms - ESA 2007, 15th Annual European Symposium, Eilat, Israel, October 8-10, 2007, Proceedings, volume 4698 of Lecture Notes in Computer Science, pages 371–382. Springer, 2007. doi:10.1007/978-3-540-75520-3_34.
- [9] Roberto Grossi, Ankur Gupta, and Jeffrey Scott Vitter. High-order entropy-compressed text indexes. In Proceedings of the Fourteenth Annual ACM-SIAM Symposium on Discrete Algorithms, January 12-14, 2003, Baltimore, Maryland, USA, pages 841–850. ACM/SIAM, 2003. URL: http://dl.acm.org/citation.cfm?id=644108.644250.
- [10] Meng He. Succinct and implicit data structures for computational geometry. In Andrej Brodnik, Alejandro López-Ortiz, Venkatesh Raman, and Alfredo Viola, editors, Space-Efficient Data Structures, Streams, and Algorithms - Papers in Honor of J. Ian Munro on the Occasion of His 66th Birthday, volume 8066 of Lecture Notes in Computer Science, pages 216–235. Springer, 2013. doi:10.1007/978-3-642-40273-9_15.
- [11] Meng He, Patrick K. Nicholson, and Norbert Zeh. A space-efficient framework for dynamic point location. In Kun-Mao Chao, Tsan-sheng Hsu, and Der-Tsai Lee, editors, Algorithms and Computation - 23rd International Symposium, ISAAC 2012, Taipei, Taiwan, December 19-21, 2012. Proceedings, volume 7676 of Lecture Notes in Computer Science, pages 548–557. Springer, 2012. doi:10.1007/978-3-642-35261-4_57.
- [12] Guy Jacobson. Space-efficient static trees and graphs. In 30th Annual Symposium on Foundations of Computer Science, Research Triangle Park, North Carolina, USA, 30 October - 1 November 1989, pages 549–554. IEEE Computer Society, 1989. doi:10.1109/SFCS.1989.63533.
- [13] Guy Joseph Jacobson. Succinct Static Data Structures. PhD thesis, Carnegie Mellon University, USA, 1988. AAI8918056.
- [14] Joseph F. JáJá, Christian Worm Mortensen, and Qingmin Shi. Space-efficient and fast algorithms for multidimensional dominance reporting and counting. In Rudolf Fleischer and Gerhard Trippen, editors, Algorithms and Computation, 15th International Symposium, ISAAC 2004, Hong Kong, China, December 20-22, 2004, Proceedings, volume 3341 of Lecture Notes in Computer Science, pages 558–568. Springer, 2004. doi:10.1007/978-3-540-30551-4_49.
- [15] Allan Grønlund Jørgensen and Kasper Green Larsen. Range selection and median: Tight cell probe lower bounds and adaptive data structures. In Dana Randall, editor, Proceedings of the Twenty-Second Annual ACM-SIAM Symposium on Discrete Algorithms, SODA 2011, San Francisco, California, USA, January 23-25, 2011, pages 805–813. SIAM, 2011. doi:10.1137/1.9781611973082.63.
- [16] Veli Mäkinen and Gonzalo Navarro. Rank and select revisited and extended. Theor. Comput. Sci., 387(3):332–347, 2007. doi:10.1016/j.tcs.2007.07.013.
- [17] Gonzalo Navarro, Yakov Nekrich, and Luís Manuel Silveira Russo. Space-efficient data-analysis queries on grids. Theor. Comput. Sci., 482:60–72, 2013. doi:10.1016/j.tcs.2012.11.031.
- [18] Yakov Nekrich. A dynamic stabbing-max data structure with sub-logarithmic query time. CoRR, abs/1109.3890, 2011. arXiv:1109.3890.
- [19] Mihai Puatracscu. Lower bounds for 2-dimensional range counting. In David S. Johnson and Uriel Feige, editors, Proceedings of the 39th Annual ACM Symposium on Theory of Computing, San Diego, California, USA, June 11-13, 2007, pages 40–46. ACM, 2007. doi:10.1145/1250790.1250797.