Advertisement
aboelsoudJr

Untitled

Aug 9th, 2022
512
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define ull unsigned long long
  6. #define fixed(n) cout << fixed << setprecision(n);
  7. #define mod 1000000007
  8. #define cin(v) for (auto&i:v) cin >> i;
  9. #define cout(v) for (auto&i:v) cout << i << " ";
  10. #define ceil(n,m) (n / m + (n%m != 0))
  11. #define all(v) v.begin(), v.end()
  12. #define rall(v) v.rbegin(), v.rend()
  13.  
  14. void lil_codi_vert(){
  15.     ios_base::sync_with_stdio(false);
  16.     cin.tie(NULL); cout.tie(NULL);
  17.     #ifndef ONLINE_JUDGE
  18.         freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
  19.     #endif
  20. }
  21.  
  22.  
  23. struct node{
  24.     ll mn , freq;
  25.  
  26.     node(ll m){
  27.         mn = m;
  28.         freq = 1;
  29.     }
  30.  
  31. };
  32.  
  33.  
  34. struct segtree{
  35.     vector<node> tree;
  36.     ll size = 1;
  37.  
  38.     segtree(ll n){
  39.         while(size < n) size *= 2;
  40.         tree.assign(size * 2, 0);
  41.     }
  42.  
  43.     node operation(node& a, node& b){
  44.         if(a.mn == b.mn){
  45.             node ans = a;
  46.             ans.freq += b.freq;
  47.             return ans;
  48.         }
  49.  
  50.         if(a.mn < b.mn) return a;
  51.        
  52.         return b;
  53.     }
  54.  
  55.     void build(vector<ll>& v, ll idx, ll tl, ll tr){
  56.         if(tl >= (ll)v.size()) return;
  57.         if(tl == tr){
  58.             tree[idx] = v[tl];
  59.             return;
  60.         }
  61.         ll mid = tl + (tr - tl) / 2;
  62.         build(v, idx * 2 + 1, tl, mid);
  63.         build(v, idx * 2 + 2, mid + 1, tr);
  64.         tree[idx] = operation(tree[idx * 2 + 1], tree[idx * 2 + 2]);
  65.     }
  66.  
  67.     void build(vector<ll>& v){
  68.         build(v, 0, 0, size-1);
  69.     }
  70.  
  71.     node query(ll l, ll r, ll idx, ll tl, ll tr){
  72.         if(tl > r || tr < l) return node(LLONG_MAX);
  73.         if(l <= tl && tr <= r) return tree[idx];
  74.         ll mid = tl + (tr-tl)/2;
  75.         node left = query(l, r, idx * 2 + 1, tl, mid);
  76.         node right =  query(l, r, idx * 2 + 2, mid + 1, tr);
  77.         return operation(left, right);
  78.     }
  79.  
  80.     node query(ll l, ll r){
  81.         return query(l, r, 0, 0, size - 1);
  82.     }
  83.  
  84.     void update(ll i, ll val, ll idx, ll tl, ll tr){
  85.         if(i < tl || i > tr) return;
  86.         if(tl == tr){
  87.             tree[idx] = val;
  88.             return;
  89.         }
  90.         ll mid = tl + (tr - tl) / 2;
  91.         update(i, val, idx * 2 + 1, tl, mid);
  92.         update(i, val, idx * 2 + 2, mid + 1, tr);
  93.         tree[idx] = operation(tree[idx * 2 + 1], tree[idx * 2 + 2]);
  94.     }
  95.  
  96.     void update(ll i, ll val){
  97.         update(i, val, 0, 0, size - 1);
  98.     }
  99.    
  100. };
  101.  
  102. int main(){
  103.     lil_codi_vert();
  104.     ll n, q; cin >> n >> q;
  105.     vector<ll> v(n); cin(v);
  106.     segtree seg(n);
  107.  
  108.     seg.build(v);
  109.     while(q--){
  110.         ll ty; cin >> ty;
  111.         if(ty == 1){
  112.             ll i, val; cin >> i >> val;
  113.             seg.update(i, val);
  114.         }else{
  115.             ll l, r; cin >> l >> r;
  116.             node ans = seg.query(l, r-1);
  117.             cout << ans.mn << " " << ans.freq << "\n";
  118.         }
  119.     }
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement