Advertisement
Ritam_C

Number of minimums

Apr 5th, 2022
831
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct segTree {
  5.     int size = 1;
  6.     vector<pair<long long, int>> mins;
  7.  
  8.     void init(int n) {
  9.         while(size < n) {
  10.             size *= 2;
  11.         }
  12.         mins.assign(2*size, {LLONG_MAX, 1});
  13.     }
  14.  
  15.     void set(int i, long long v, int x, int lx, int rx) {
  16.         if(rx-lx == 1) {
  17.             mins[x] = {v, 1};
  18.             return;
  19.         }
  20.         int m = (lx+rx)/2;
  21.         if(i < m) {
  22.             set(i, v, 2*x+1, lx, m);
  23.         } else {
  24.             set(i, v, 2*x+2, m, rx);
  25.         }
  26.         if(mins[2*x+1].first == mins[2*x+2].first) {
  27.             mins[x] = {mins[2*x+1].first, mins[2*x+1].second+mins[2*x+2].second};
  28.         } else if(mins[2*x+1].first < mins[2*x+2].first) {
  29.             mins[x] = mins[2*x+1];
  30.         } else {
  31.             mins[x] = mins[2*x+2];
  32.         }
  33.     }
  34.  
  35.     void set(int i, long long v) {
  36.         set(i, v, 0, 0, size);
  37.     }
  38.  
  39.     pair<long long, int> getMin(int l, int r, int x, int lx, int rx) {
  40.         if(lx >= r || rx <= l) {
  41.             return {LLONG_MAX, 1};
  42.         }
  43.         if(l <= lx && rx <= r) {
  44.             return mins[x];
  45.         }
  46.         int m = (lx+rx)/2;
  47.         pair<long long, int> m1 = getMin(l, r, 2*x+1, lx, m), m2 = getMin(l, r, 2*x+2, m, rx);
  48.         if(m1.first == m2.first) {
  49.             return {m1.first, m1.second+m2.second};
  50.         } else if(m1.first < m2.first) {
  51.             return m1;
  52.         } else {
  53.             return m2;
  54.         }
  55.     }
  56.  
  57.     pair<long long, int> getMin(int l, int r) {
  58.         return getMin(l, r, 0, 0, size);
  59.     }
  60. };
  61.  
  62. int main() {
  63.     ios_base::sync_with_stdio(false);
  64.     cin.tie(NULL); cout.tie(NULL);
  65.     int n, q; cin >> n >> q;
  66.     segTree st; st.init(n);
  67.     for(int i = 0; i < n; i++) {
  68.         long long v; cin >> v;
  69.         st.set(i, v);
  70.     }
  71.     while(q--) {
  72.         int op; cin >> op;
  73.         if(op == 1) {
  74.             int i; long long v;
  75.             cin >> i >> v;
  76.             st.set(i, v);
  77.         } else {
  78.             int l, r;
  79.             cin >> l >> r;
  80.             pair<long long, int> mi = st.getMin(l, r);
  81.             cout << mi.first << " " << mi.second << "\n";
  82.         }
  83.     }
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement