Advertisement
Georgiy1108

SQRT - Sample

Nov 8th, 2023
789
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define speed() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
  3. #define pb push_back
  4. #define fi first
  5. #define se second
  6. using namespace std;
  7. typedef long long ll;
  8. typedef double db;
  9. typedef pair<int, int> pii;
  10.  
  11. struct block{
  12.     vector<ll> srt;
  13.     ll sum = 0;
  14. };
  15. vector<block> sq;
  16. ll len = sqrt(3 * 1e5);
  17. ll last_ans = 0;
  18. ll mod = 1e9;
  19.  
  20. pii find_x( ll x ){
  21.     int i = 0, j;
  22.     while( i < sq.size() - 1 && sq[i].srt.back() < x ) i++;
  23.     j = (int)(lower_bound(sq[i].srt.begin(), sq[i].srt.end(), x) - sq[i].srt.begin());
  24.     return {i, j};
  25. }
  26.  
  27. void split( ll i ){
  28.     sq.insert( sq.begin() + i + 1, block() );
  29.     for( int j = 0; j < len; ++j ){
  30.         sq[i+1].srt.pb(sq[i].srt.back());
  31.         sq[i+1].sum += sq[i].srt.back();
  32.         sq[i].sum -= sq[i].srt.back();
  33.         sq[i].srt.pop_back();
  34.     }
  35.     reverse( sq[i+1].srt.begin(), sq[i+1].srt.end() );
  36. }
  37.  
  38. void add( ll x ){
  39.     int i, j;
  40.     tie( i, j ) = find_x(x);
  41.     if( j != sq[i].srt.size() && sq[i].srt[j] == x ) return;
  42.    
  43.     sq[i].srt.insert( sq[i].srt.begin() + j, x );
  44.     sq[i].sum += x;
  45.     if( len*2 == sq[i].srt.size() ) split(i);
  46. }
  47.  
  48. ll get_sum( ll L, ll R ){
  49.     int l, i, r, j;
  50.     tie(l, i) = find_x(L);
  51.     tie(r, j) = find_x(R);
  52.     if( j == sq[r].srt.size() || sq[r].srt[j] > R ) j--;
  53.    
  54.     ll ans = 0;
  55.    
  56.     if( i || (l == r) ){
  57.         int end = ( l == r ? j+1 : (int)sq[l].srt.size() );
  58.         for( ; i < end; ++i ) ans += sq[l].srt[i];
  59.         if( l == r ) return ans;
  60.         l++;
  61.     }
  62.    
  63.     while( l < r ){
  64.         ans += sq[l].sum;
  65.         l++;
  66.     }
  67.    
  68.     i = 0;
  69.     for( ; i <= j; ++i ) ans += sq[l].srt[i];
  70.    
  71.     return ans;
  72. }
  73.  
  74. int main(){
  75.     speed();
  76.    
  77.     int n;
  78.     cin >> n;
  79.     len = sqrt(n);
  80.     sq.pb(block());
  81.     while( n-- ){
  82.         char c;
  83.         cin >> c;
  84.         if( c == '+' ){
  85.             ll x;
  86.             cin >> x;
  87.             add( (x + last_ans) % mod );
  88.             last_ans = 0;
  89.         } else{
  90.             ll l, r;
  91.             cin >> l >> r;
  92.             last_ans = get_sum( l, r );
  93.             cout << last_ans << '\n';
  94.         }
  95.     }
  96.    
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement