Advertisement
Josif_tepe

Untitled

Feb 26th, 2023
623
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <map>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <stack>
  8. #include <queue>
  9. using namespace std;
  10. typedef long long ll;
  11. const int maxn = 2e5 + 10;
  12. struct node {
  13.     int min_value;
  14.     node () {}
  15.     node(int _min_value) {
  16.         min_value = _min_value;
  17.     }
  18. };
  19. const node NULL_VALUE = node(2e9);
  20. int arr[maxn];
  21. node segment_tree[3 * maxn];
  22. void merge_nodes(node & A, node & tmp1, node & tmp2) {
  23.     A.min_value = min(tmp1.min_value, tmp2.min_value);
  24. }
  25. node merge_query(node A, node B) {
  26.     node result;
  27.     result.min_value = min(A.min_value, B.min_value);
  28.     return result;
  29. }
  30. void build_tree(int L, int R, int position) {
  31.     if(L == R) {
  32.         segment_tree[position].min_value = arr[L];
  33.     }
  34.     else {
  35.         int middle = (L + R) / 2;
  36.         build_tree(L, middle, 2 * position);
  37.         build_tree(middle + 1, R, 2 * position + 1);
  38.         merge_nodes(segment_tree[position], segment_tree[2 * position], segment_tree[2 * position + 1]);
  39.     }
  40. }
  41. node query(int L, int R, int position, int & i, int & j) {
  42.     // L R i L R j L R
  43.     if(i <= L and R <= j) {
  44.         return segment_tree[position];
  45.     }
  46.     if(R < i or j < L) {
  47.         return NULL_VALUE;
  48.     }
  49.     int middle = (L + R) / 2;
  50.     return merge_query(query(L, middle, 2 * position, i, j), query(middle + 1, R, 2 * position + 1, i, j));
  51. }
  52. void update(int L, int R, int position, int & idx, node & new_value) {
  53.     if(L == R) {
  54.         segment_tree[position] = new_value;
  55.         return;
  56.     }
  57.     int middle = (L + R) / 2;
  58.     if(idx <= middle) {
  59.         update(L, middle, 2 * position, idx, new_value);
  60.     }
  61.     else {
  62.         update(middle + 1, R, 2 * position + 1, idx, new_value);
  63.     }
  64.     merge_nodes(segment_tree[position], segment_tree[2 * position], segment_tree[2 * position + 1]);
  65. }
  66. int main() {
  67.     ios_base::sync_with_stdio(false);
  68.     int n, q;
  69.     cin >> n >> q;
  70.    
  71.     for(int i = 0; i < n; i++) {
  72.         cin >> arr[i];
  73.     }
  74.     build_tree(0, n - 1, 1);
  75.    
  76.     for(int i = 0; i < q; i++) {
  77.         int type;
  78.         cin >> type;
  79.        
  80.         if(type == 1) {
  81.             int idx, new_value;
  82.             cin >> idx >> new_value;
  83.             idx--;
  84.             node update_value(new_value);
  85.             update(0, n - 1, 1, idx, update_value);
  86.         }
  87.         else {
  88.             int a, b;
  89.             cin >> a >> b;
  90.             a--;
  91.             b--;
  92.            
  93.             cout << query(0, n - 1, 1, a, b).min_value << endl;
  94.         }
  95.     }
  96.     return 0;
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement