Advertisement
scottish_esquire

Поиск НОДа на заданном промежутке массива

Apr 20th, 2022
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <numeric>
  4.  
  5.  
  6. // Поиск НОДа на заданном промежутке массива.
  7.  
  8.  
  9. // Заполнение массива.
  10. void build(int v, int l, int r, std::vector <int> &tree, std::vector <int> &a) {
  11.     if (r - l == 1) {
  12.         tree[v] = a[l];
  13.         return;
  14.     }
  15.     int m = (l + r) / 2;
  16.     build(2 * v + 1, l, m, tree, a);
  17.     build(2 * v + 2, m, r, tree, a);
  18.     tree[v] = std::gcd(tree[2 * v + 1], tree[2 * v + 2]);
  19. }
  20.  
  21. // Обработка запроса.
  22. int query(int v, int l, int r, int ql, int qr, std::vector <int> &tree) {
  23.     if (ql <= l && r <= qr) {
  24.         return tree[v];
  25.     } else if (r <= ql || qr <= l) {
  26.         return 0;
  27.     } else {
  28.         int m = (l + r) / 2;
  29.         int ans_left = query(2 * v + 1, l, m, ql, qr, tree);
  30.         int ans_right = query(2 * v + 2, m, r, ql, qr, tree);
  31.         return std::gcd(ans_left, ans_right);
  32.     }
  33. }
  34.  
  35. int main() {
  36.     int num, p, quest_l, quest_r;
  37.     std::cin >> num >> quest_l >> quest_r; // Num = количество элементов в массиве.
  38.     std::vector<int> a;
  39.     for (auto i = 0; i < num; i++) {
  40.         std::cin >> p;
  41.         a.push_back(p);
  42.     }
  43.     std::vector<int> tree(a.size() * 4); // Размер задаётся с запасом (обычно умножают на 4).
  44.     build(0, 0, num, tree, a);
  45.     for (size_t i = 0; i < tree.size(); ++i) {
  46.         std::cout << tree[i] << ' ';
  47.     }
  48.     std::cout << '\n' << query(0, 0, num, quest_l, quest_r, tree); // Запрос = [quest_l, quest_r) , нумерация начинается с нуля.
  49.     return 0;
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement