Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <numeric>
- // Поиск НОДа на заданном промежутке массива.
- // Заполнение массива.
- void build(int v, int l, int r, std::vector <int> &tree, std::vector <int> &a) {
- if (r - l == 1) {
- tree[v] = a[l];
- return;
- }
- int m = (l + r) / 2;
- build(2 * v + 1, l, m, tree, a);
- build(2 * v + 2, m, r, tree, a);
- tree[v] = std::gcd(tree[2 * v + 1], tree[2 * v + 2]);
- }
- // Обработка запроса.
- int query(int v, int l, int r, int ql, int qr, std::vector <int> &tree) {
- if (ql <= l && r <= qr) {
- return tree[v];
- } else if (r <= ql || qr <= l) {
- return 0;
- } else {
- int m = (l + r) / 2;
- int ans_left = query(2 * v + 1, l, m, ql, qr, tree);
- int ans_right = query(2 * v + 2, m, r, ql, qr, tree);
- return std::gcd(ans_left, ans_right);
- }
- }
- int main() {
- int num, p, quest_l, quest_r;
- std::cin >> num >> quest_l >> quest_r; // Num = количество элементов в массиве.
- std::vector<int> a;
- for (auto i = 0; i < num; i++) {
- std::cin >> p;
- a.push_back(p);
- }
- std::vector<int> tree(a.size() * 4); // Размер задаётся с запасом (обычно умножают на 4).
- build(0, 0, num, tree, a);
- for (size_t i = 0; i < tree.size(); ++i) {
- std::cout << tree[i] << ' ';
- }
- std::cout << '\n' << query(0, 0, num, quest_l, quest_r, tree); // Запрос = [quest_l, quest_r) , нумерация начинается с нуля.
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement