2.6 KiB
id | title | author | description |
---|---|---|---|
SRQ | Static Range Queries | Benjamin Qi | Range queries for any associative operation over a static array. |
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
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.
A data structure known as sqrt-tree can speed up preprocessing time to O(N\log \log N)
.