Skip to content

Commit 5cea2b1

Browse files
authored
Merge pull request #159 from ar1emicus/prose-patch-1
Update sqrt-structures.md
2 parents 2e2c4df + b80dafe commit 5cea2b1

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

content/russian/cs/range-queries/sqrt-structures.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
---
22
title: Корневые структуры
33
authors:
4-
- Сергей Слотин
5-
- Иван Сафонов
4+
- Сергей Слотин
5+
- Иван Сафонов
66
weight: 6
7-
date: 2021-09-13
7+
date: 2022-08-16
88
---
99

1010
Корневые оптимизации можно использовать много для чего, в частности в контексте структур данных.
@@ -23,16 +23,15 @@ date: 2021-09-13
2323
```c++
2424
// c это и количество блоков, и также их размер; оно должно быть чуть больше корня
2525
const int maxn = 1e5, c = 330;
26-
int a[maxn], b[c];
27-
int add[c];
26+
int a[maxn], b[c], add[c];
2827

2928
for (int i = 0; i < n; i++)
3029
b[i / c] += a[i];
3130
```
3231

33-
Заведем также массив `add` размера $\sqrt n$, который будем использовать для отложенной операции прибавления на блоке. Будем считать, что реальное значение $i$-го элемента равно `a[i] + add[i / c]`.
32+
Заведем также массив `add` размера $\sqrt n$, который будем использовать для отложенной операции прибавления на блоке: будем считать, что реальное значение $i$-го элемента равно `a[i] + add[i / c]`.
3433

35-
Теперь мы можем отвечать на запросы первого типа за $O(\sqrt n)$ на запрос:
34+
Теперь мы можем отвечать на запросы первого типа за $O(\sqrt n)$ операций на запрос:
3635

3736
1. Для всех блоков, лежащих целиком внутри запроса, просто возьмём уже посчитанные суммы и сложим.
3837
2. Для блоков, пересекающихся с запросом только частично (их максимум два — правый и левый), проитерируемся по нужным элементам и поштучно прибавим к ответу.
@@ -68,6 +67,7 @@ void upd(int l, int r, int x) {
6867
l += c;
6968
}
7069
else {
70+
b[l / c] += x;
7171
a[l] += x;
7272
l++;
7373
}
@@ -111,8 +111,8 @@ vector< vector<int> > blocks;
111111
// возвращает индекс блока и индекс элемента внутри блока
112112
pair<int, int> find_block(int pos) {
113113
int idx = 0;
114-
while (blocks[idx].size() >= pos)
115-
pos -= blocks[idx--].size();
114+
while (blocks[idx].size() <= pos)
115+
pos -= blocks[idx++].size();
116116
return {idx, pos};
117117
}
118118
```

0 commit comments

Comments
 (0)