Advertisement
AlexG2230954

Untitled

Apr 8th, 2022
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5. const int INF = 1e9;
  6.  
  7. struct SegTree {
  8.     vector<int> data; // двоичное дерево, представленное в виде массива (левое - ind * 2, правое - ind * 2 + 1)
  9.     int n; // количество элементов отрезка
  10.  
  11.     SegTree(const vector<int> & dots) {
  12.         n = dots.size();
  13.         data.resize(4 * n, INF);
  14.         build_data(1, 1, n, dots);
  15.     }
  16.  
  17.     void build_data(int id, int l, int r, const vector<int> & dots) {
  18.         if(l == r) {
  19.             data[id] = dots[l - 1];
  20.             return;
  21.         }
  22.  
  23.         int m = (l + r) / 2;
  24.         build_data(id * 2, l, m, dots);
  25.         build_data(id * 2 + 1, m + 1, r, dots);
  26.  
  27.         data[id] = min(data[2 * id], data[2 * id + 1]);
  28.     }
  29.  
  30.     int get(int l, int r) {
  31.         return get(1, l, r, 1, n);
  32.     }
  33.  
  34.     int get(int id, int l, int r, int curr_l, int curr_r) {
  35.         if(l <= curr_l && curr_r <= r)
  36.             return data[id];
  37.  
  38.         int m = (curr_l + curr_r) / 2;
  39.  
  40.         if(r <= m)
  41.             return get(2 * id, l, r, curr_l, m);
  42.  
  43.         if(m <= l)
  44.             return get(2 * id + 1, l, r, m + 1, curr_r);
  45.  
  46.         return min(
  47.             get(2 * id, l, r, curr_l, m),
  48.             get(2 * id + 1, l, r, m + 1, curr_r)
  49.         );
  50.     }
  51.  
  52.     void set(int pos, int val) {
  53.         set(1, 1, n, pos, val);
  54.     }
  55.  
  56.     void set(int id, int l, int r, int pos, int val) {
  57.         if(l == r) {
  58.             data[id] = val;
  59.             return;
  60.         }
  61.  
  62.         int m = (l + r) / 2;
  63.  
  64.         if(pos <= m) set(id * 2, l, m, pos, val);
  65.         else set(id * 2 + 1, m + 1, r, pos, val);
  66.  
  67.         data[id] = min(data[id * 2], data[id * 2 + 1]);
  68.     }
  69. };
  70.  
  71. int main() {
  72.     vector<int> dots;
  73.     int n, m;
  74.     string command;
  75.  
  76.     cin >> n;
  77.     dots.resize(n, 0);
  78.  
  79.     for(auto & el : dots)
  80.         cin >> el;
  81.  
  82.     SegTree tree(dots);
  83.  
  84.     cin >> m;
  85.     while(m--) {
  86.         cin >> command;
  87.  
  88.         if(command == "get") {
  89.             int l, r;
  90.             cin >> l >> r;
  91.             cout << tree.get(l, r) << endl;
  92.         }
  93.  
  94.         else if(command == "set") {
  95.             int pos, val;
  96.             cin >> pos >> val;
  97.             tree.set(pos, val);
  98.         }
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement