2.3 KiB
id | title | author | prerequisites | description | ||||
---|---|---|---|---|---|---|---|---|
SRQ | 1D Static Range Queries | Benjamin Qi | Given a static array $A[1],A[2],\ldots,A[N]$, you want to answer queries in the form $A[l]\ominus A[l+1]\ominus \cdots \ominus A[r]$ where $\ominus$ denotes any associative operation. |
This can be done in O(1)
time each with O(N\log N)
time preprocessing.
Range Minimum Query
First we'll consider the special case when \ominus
denotes min
.
Tutorial
- CPH 9.1
- cp-algorithms RMQ
Divide & Conquer
Divide & conquer can refer to many different techniques. In this case, we use it to answer Q
queries offline in O((N+Q)\log N)
time.
Suppose that all queries satisfiy L\le l\le r\le R
(initially, L=1
and R=N
). Letting M=\left\lfloor \frac{L+R}{2}\right\rfloor
, we can compute
$$
lef[l]=A[l]\ominus A[l+1]\ominus \cdots \ominus A[M]
for all
L\le l\le M
and
$$
rig[r]=A[M+1]\ominus A[M+2] \ominus \cdots\ominus A[r]
for each
M< r\le R
. Then the answer for all queries satisfying l\le M< r
is simply lef[l]\ominus rig[r]
due to the associativity condition. After that, we recurse on all query intervals completely contained within [L,M]
and [M+1,R]
independently.
Actually, this can be adjusted to answer queries online in O(1)
time each. See my implementation here.
This data structure is known as sqrt-tree.