Advertisement
mfgnik

Untitled

Jun 27th, 2020
1,336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <utility>
  4. #include <vector>
  5.  
  6.  
  7. template<class T>
  8. class SegmentTree {
  9. public:
  10.     explicit SegmentTree(const std::vector<T> &numbers) : numbers_amount_(static_cast<int>(numbers.size())),
  11.                                                           segment_tree_(2 * numbers_amount_) {
  12.         for (int index = 0; index < numbers_amount_; ++index) {
  13.             segment_tree_[numbers_amount_ + index] = {numbers[index], index};
  14.         }
  15.         for (int index = numbers_amount_ - 1; index > 0; --index) {
  16.             segment_tree_[index] = std::max(segment_tree_[2 * index], segment_tree_[2 * index + 1]);
  17.         }
  18.     }
  19.  
  20.     std::pair<T, int> GetMax(int left, int right) {
  21.         Item max = {segment_tree_[left + numbers_amount_].value, left};
  22.         left += numbers_amount_;
  23.         right += numbers_amount_;
  24.         while (left < right) {
  25.             if (left % 2) {
  26.                 max = std::max(max, segment_tree_[left++]);
  27.             }
  28.             if (right % 2) {
  29.                 max = std::max(max, segment_tree_[--right]);
  30.             }
  31.             left /= 2;
  32.             right /= 2;
  33.         }
  34.         return {max.value, max.position};
  35.     }
  36.  
  37.     void Update(int position, T value) {
  38.         segment_tree_[position + numbers_amount_] = {value, position};
  39.         position += numbers_amount_;
  40.         while (position > 1) {
  41.             position /= 2;
  42.             segment_tree_[position] = std::max(segment_tree_[2 * position], segment_tree_[2 * position + 1]);
  43.         }
  44.     }
  45.  
  46. private:
  47.     struct Item {
  48.         T value;
  49.         int position;
  50.  
  51.         Item() = default;
  52.  
  53.         Item(T value, int position) : value(value), position(position) {}
  54.  
  55.         bool operator<(const Item& other) const {
  56.             return value < other.value || value == other.value && position > other.position;
  57.         }
  58.     };
  59.  
  60.     int numbers_amount_;
  61.  
  62.     std::vector<Item> segment_tree_;
  63. };
  64.  
  65.  
  66. int main() {
  67.     int amount_numbers;
  68.     std::cin >> amount_numbers;
  69.     std::vector<int> numbers(amount_numbers);
  70.     for (auto &number : numbers) {
  71.         std::cin >> number;
  72.     }
  73.  
  74.     auto segment_tree = SegmentTree<int>(numbers);
  75.  
  76.     int queries_amount;
  77.     std::cin >> queries_amount;
  78.     while (queries_amount--) {
  79.         char command;
  80.         std::cin >> command;
  81.         switch (command) {
  82.             case 'u':
  83.                 int position, value;
  84.                 std::cin >> position >> value;
  85.                 segment_tree.Update(position - 1, value);
  86.                 break;
  87.             case 's':
  88.                 int left, right;
  89.                 std::cin >> left >> right;
  90.                 auto max = segment_tree.GetMax(left - 1, right);
  91.                 std::cout << max.second + 1 << " ";
  92.                 break;
  93.         }
  94.     }
  95.  
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement