Dsxv

cses_1144

Jul 21st, 2020
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace std ;
  5. using namespace __gnu_pbds ;
  6.  
  7. typedef tree<int, null_type , less<int> , rb_tree_tag,
  8.             tree_order_statistics_node_update>
  9.         ordered_set  ;  
  10. const int N = 1e6 ;
  11.  
  12. struct BIT{
  13.     int n ;
  14.     vector<int> v;
  15.     BIT(int n){
  16.         this->n = n ;
  17.         v.resize(n) ;
  18.     }
  19.     void update(int ind , int val){
  20.         ind++ ;
  21.         for(int i = ind ; i < n ; i += i&-i){
  22.             v[i] += val ;
  23.         }
  24.     }
  25.     int query(int ind){
  26.         ind++ ;
  27.         int sum = 0 ;
  28.         for(int i = ind ; i > 0 ; i -= i&-i){
  29.             sum += v[i] ;
  30.         }
  31.         return sum ;
  32.     }
  33. } bit(N);
  34.  
  35. pair<vector<int>,vector<int>> compress(vector<int>& a){
  36.     int n = a.size() ;
  37.     map<int,vector<int>> mp;
  38.     for(int i = 0 ; i < n ; i++){
  39.         mp[a[i]].push_back(i) ;
  40.     }
  41.     vector<int> ans(n) , mapped(n) ;
  42.     int cnt = 0 ;
  43.     for(auto i : mp){
  44.         for(auto j : i.second){
  45.             ans[j] = cnt ;
  46.         }
  47.         mapped[cnt] = i.first ;
  48.         cnt++ ;
  49.     }
  50.     return {ans,mapped} ;
  51. }
  52.  
  53. struct qt{
  54.     char ch ;
  55.     int a , b ;
  56. } ;
  57.  
  58. int32_t main(){
  59.    
  60.     ios :: sync_with_stdio(0) ; cin.tie(0) ;
  61.     int n , q ;
  62.     cin >> n >> q ;
  63.     vector<int> v ;
  64.     int a[n] ;
  65.     for(int i = 0 ; i < n ; i++){
  66.         cin >> a[i] ;
  67.         v.push_back(a[i]) ;
  68.     }
  69.     vector<qt> qr(q) ;
  70.     vector<qt> mp(q) ;
  71.     for(int i = 0 ; i < q ; i++){
  72.         char ch ;
  73.         int a , b ;
  74.         cin >> ch >> a >> b ;
  75.         qr[i].ch = ch ; qr[i].a = a ;
  76.         qr[i].b = b ;
  77.         if(ch == '!') {
  78.             mp[i].b = v.size() ; v.push_back(b) ;
  79.         } else {
  80.             mp[i].a = v.size() ; v.push_back(a) ;
  81.             mp[i].b = v.size() ; v.push_back(b) ;
  82.         }
  83.     }
  84.     // compression
  85.     auto [ans , mapped] = compress(v) ;
  86.     for(int i = 0 ; i < n ; i++) a[i] = ans[i] ;
  87.     for(int i = 0 ; i < q ; i++){
  88.         if(qr[i].ch == '!'){
  89.             qr[i].b = ans[mp[i].b] ;
  90.         } else {
  91.             qr[i].a = ans[mp[i].a] ;
  92.             qr[i].b = ans[mp[i].b] ;
  93.         }
  94.     }
  95.     // compression_end
  96.     for(int i = 0 ; i < n ; i++){
  97.         bit.update(a[i] , 1) ;
  98.     }
  99.     for(auto i : qr){
  100.         if(i.ch == '!'){
  101.             bit.update(a[i.a-1], -1) ;
  102.             a[i.a - 1] = i.b ;
  103.             bit.update(a[i.a-1], 1) ;
  104.         } else {
  105.             cout << bit.query(i.b) - bit.query(i.a-1) << '\n' ;
  106.         }
  107.     }
  108.     return 0 ;
  109. }
Add Comment
Please, Sign In to add comment