Advertisement
newb_ie

Number of minimum / maximum on a segment[Segment Tree]

Dec 13th, 2020 (edited)
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. /*
  2. ======================
  3. [     ___T_          ]
  4. [    | 6=6 | =>HI :-)]
  5. [    |__o__|         ]
  6. [ >===]__o[===<      ]
  7. [     [o__]          ]
  8. [      .".           ]
  9. [      |_|           ]
  10. [                    ]
  11. ======================
  12. */
  13.  
  14. #include <bits/stdc++.h>
  15. using namespace std;
  16.  
  17. struct item {
  18.     int m,c;
  19. };
  20.  
  21. struct Tree {
  22.     int size = 1;
  23.     vector<item> values;
  24.     void init (int n) {
  25.         while (size < n) size *= 2;
  26.         values.resize(2 * size);
  27.     }
  28.    
  29.     item merge (item a,item b) {
  30.         if (a.m < b.m) return a;
  31.         if (a.m > b.m) return b;
  32.         return {a.m,a.c + b.c};
  33.     }
  34.    
  35.     item single (int v) {
  36.         return {v,1};
  37.     }
  38.    
  39.     item NEUTRAL_ELEMENT = {INT_MAX,0};
  40.    
  41.     void build (vector<int> &a,int x,int lx,int rx) {
  42.         if (rx - lx == 1) {
  43.             if (lx < (int) a.size()) {
  44.                 values[x] = single (a[lx]);
  45.             }
  46.             return;
  47.         }
  48.         int m = (lx + rx) / 2;
  49.         build (a,2 * x + 1,lx,m);
  50.         build (a,2 * x + 2,m,rx);
  51.         values[x] = merge (values[2 * x + 1],values[2 * x + 2]);
  52.     }
  53.    
  54.     void build (vector<int> &a) {
  55.         build (a,0,0,size);
  56.     }
  57.    
  58.     void set (int i,int v,int x,int lx,int rx) {
  59.         if (rx - lx == 1) {
  60.             values[x] = single(v);
  61.             return;
  62.         }
  63.         int m = (lx + rx) / 2;
  64.         if (i < m) {
  65.             set (i,v,2 * x + 1,lx,m);
  66.         } else {
  67.             set (i,v,2 * x + 2,m,rx);
  68.         }
  69.         values[x] = merge (values[2 * x + 1],values[2 * x + 2]);
  70.     }
  71.     void set (int i,int v) {
  72.         set (i,v,0,0,size);
  73.     }
  74.     item calc (int l,int r,int x,int lx,int rx) {
  75.         if (lx >= r or l >= rx) return NEUTRAL_ELEMENT;
  76.         if (lx >= l and rx <= r) return values[x];
  77.         int m = (lx + rx) / 2;
  78.         return merge(calc(l,r,2 * x + 1,lx,m),calc (l,r,2 * x + 2,m,rx));
  79.     }
  80.     item calc (int l,int r) {
  81.         return calc(l,r,0,0,size);
  82.     }
  83. };
  84.  
  85. int main () {
  86.      ios::sync_with_stdio(false);
  87.      cin.tie(nullptr);
  88.      cout.tie(nullptr);
  89.      int T = 1;
  90.      //~ cin >> T;
  91.      for (int test_case = 1; test_case <= T; ++test_case) {
  92.          int n,m;
  93.          cin >> n >> m;
  94.          Tree st;
  95.          st.init(n);
  96.          vector<int> a(n);
  97.          for (int i = 0; i < n; ++i) {
  98.              cin >> a[i];
  99.          }
  100.          st.build (a);
  101.          for (int i = 1; i <= m; ++i) {
  102.              int type;
  103.              cin >> type;
  104.              if (type == 1) {
  105.                  int idx,v;
  106.                  cin >> idx >> v;
  107.                  st.set(idx,v);
  108.              } else {
  109.                  int l,r;
  110.                  cin >> l >> r;
  111.                  item res = st.calc(l,r);
  112.                  cout << res.m << " " << res.c << "\n";
  113.              }
  114.          }
  115.      }
  116.      //cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
  117. }
  118.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement