Вы можете сделать это в постоянное время, используя пробел O(n)
, где n
- размер вашего массива. Первоначальная конструкция занимает O(n)
.
. Для массива A
сначала необходимо построить массив XOR-A
следующим образом:
XOR-A[0] = A[0]
For i from 1 to n-1:
XOR-A[i] = XOR-A[i-1] xor A[i]
Затем вы можете ответить на запрос в Диапазон (l, r) выглядит следующим образом:
get_xor_range(l, r, XOR-A):
return XOR-A[l-1] xor XOR-A[r]
Мы используем тот факт, что для любого x
, x xor x = 0
. Вот что делает эту работу здесь.
Редактировать: Извините, я сначала плохо понял проблему.
Вот метод обновления массива за O(m + n)
время и O(n)
пространство, где n
- размер массива и m
количество запросов.
Обозначение: массив A
, размера n
, запросы (l_i, r_i, x_i), 0 <= i < m
L <- array of tuple (l_i, x_i) sorted in ascending order by the l_i
R <- array of tuple (r_i, x_i) sorted in ascending order by the r_i
X <- array initialised at 0 everywhere, of size `n`
idx <- 0
l, x <- L[idx]
for j from 0 to n-1 do:
while l == j do:
X[j] <- X[j] xor x
idx ++
l, x <- L[idx]
if j < n then X[j+1] <- X[j]
idx <- 0
r, x <- R[idx]
for j from 0 to n-1 do:
while r == j do:
X[j] <- X[j] xor x
idx ++
r, x <- R[idx]
if j < n then X[j+1] <- X[j]
for j from 0 to n-1 do:
A[j] <- A[j] xor X[j]