sandeep03edu

Number of Minimums on a Segment

Dec 8th, 2022
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define MOD 1000000007;
  5.  
  6. #define got cout<<"Yes\n"; return;
  7. #define got0 cout<<"Yes\n"; return 0;
  8.  
  9. #define bhak cout<<"No\n"; return;
  10. #define bhak0 cout<<"No\n"; return 0;
  11.  
  12. #define bas cout<<"\n";
  13.  
  14.  
  15. pair<ll,ll> constructTree(ll ts, ll te, ll ti, vector<pair<ll,ll>> &tree, vector<ll> &vec){
  16.     if(ts==te){
  17.         return tree[ti] = {vec[ts], 1};
  18.     }
  19.    
  20.     ll mid = ts + (te-ts)/2;
  21.    
  22.     pair<ll,ll> left = constructTree(ts, mid, 2*ti+1, tree, vec);
  23.     pair<ll,ll> right = constructTree(mid+1, te, 2*ti+2, tree, vec);
  24.    
  25.     ll mini = min(left.first, right.first);
  26.    
  27.     ll ct=0;
  28.    
  29.     if(mini == left.first){
  30.         ct+= left.second;
  31.     }
  32.    
  33.     if(mini == right.first){
  34.         ct += right.second;
  35.     }
  36.    
  37.     return tree[ti] = {mini, ct};
  38.  
  39. }
  40.  
  41. void printTree(vector<pair<ll,ll>> &tree){
  42.     ll ct = 0;
  43.     ll maxi = 1;
  44.     for(auto a : tree){
  45.         cout<<"("<<a.first<<","<<a.second<<")"<<" ";
  46.        
  47.         ct++;
  48.         if(maxi==ct){
  49.             maxi *=2;
  50.             ct=0;
  51.             bas
  52.         }
  53.     }
  54. }
  55.  
  56.  
  57. pair<ll,ll> getMini(ll ts, ll te, ll rs, ll re, ll ti, vector<pair<ll,ll>> &tree){
  58.     if(te<rs || ts>re){
  59.         return {1e12, 1e12};
  60.     }
  61.    
  62.     cout<<"Mini Target: ("<<rs<<","<<re<<") Moving to ("<<ts<<","<<te<<")"; bas
  63.  
  64.     if(ts>=rs && te<=re){
  65.         return tree[ti];
  66.     }
  67.    
  68.    
  69.     if(te==ts){
  70.         return tree[ti];
  71.     }
  72.    
  73.     ll mid = ts + (te-ts)/2;
  74.    
  75.     return min(
  76.                 getMini(ts, mid, rs, re,  2*ti+1, tree),
  77.                 getMini(mid+1, te, rs, re,  2*ti+2, tree)
  78.         );
  79. }
  80.  
  81. pair<ll,ll> update(ll ts, ll te, ll ti, ll tar, ll val, vector<pair<ll,ll>> &tree){
  82.     if(tar>te || tar<ts){
  83.         return tree[ti];
  84.     }
  85.    
  86.     // cout<<"Update Target is "<<tar<<" moving to ("<<ts<<","<<te<<")"; bas
  87.  
  88.     if(ts==te){
  89.         if(ts==tar){
  90.             tree[ti] = {val, 1};
  91.         }
  92.        
  93.         return tree[ti];
  94.     }
  95.  
  96.    
  97.     ll mid = ts + (te-ts)/2;
  98.    
  99.     pair<ll,ll> left = update(ts, mid, 2*ti+1, tar, val, tree);
  100.     pair<ll,ll> right = update(mid+1, te, 2*ti+2, tar, val, tree);
  101.    
  102.     ll mini = min(left.first, right.first);
  103.    
  104.     ll ct=0;
  105.    
  106.     if(mini == left.first){
  107.         ct+= left.second;
  108.     }
  109.    
  110.     if(mini == right.first){
  111.         ct += right.second;
  112.     }
  113.    
  114.     return tree[ti] = {mini, ct};
  115. }
  116.  
  117. int main() {
  118.     ll n, m; cin>>n>>m;
  119.     vector<ll> vec(n);
  120.    
  121.     for(ll i=0; i<n; ++i){
  122.         cin>>vec[i];
  123.     }
  124.    
  125.     vector<pair<ll,ll>> tree(4*n);
  126.    
  127.     constructTree(0, n-1, 0, tree, vec);
  128.    
  129.     // printTree(tree);
  130.    
  131.     while(m--){
  132.         ll a, b, c;
  133.         cin>>a>>b>>c;
  134.        
  135.         if(a==1){
  136.             update(0, n-1, 0, b, c, tree);
  137.         }
  138.         else if(a==2){
  139.             // printTree(tree);
  140.             pair<ll,ll> ans = getMini(0, n-1, b, c-1, 0, tree);
  141.             cout<<ans.first<<" "<<ans.second; bas
  142.         }
  143.     }
  144.    
  145.    
  146.  
  147.     return 0;
  148. }
  149.  
Advertisement
Add Comment
Please, Sign In to add comment