Advertisement
RaFiN_

range update and range query with sqrt decompo

Aug 29th, 2020
2,387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. //range update and range query with sqrt decompo
  2. #include<bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. #define ll long long
  7.  
  8. const int mod = 1e9 + 7;
  9.  
  10. const int N = 5e5 + 10,Sz = 450;
  11.  
  12. int n,q,k,arr[N],to_add[Sz+10],sum[Sz+10][1005];
  13.  
  14. void Build() {
  15.     for(int i = 0; i < n; i++) {
  16.         sum[i/Sz][arr[i]] ++;
  17.     }
  18. }
  19.  
  20. int query(int l,int r) {
  21.     int ans = 0;
  22.     for(int i = l; i <= r; i++) {
  23.         ans += sum[i][(k-to_add[i])%k];
  24.     }
  25.     return ans;
  26. }
  27.  
  28. void update(int l,int r,int val) {
  29.     for(int i = l; i <= r; i++) {
  30.         to_add[i] += val;
  31.         to_add[i] %= k;
  32.     }
  33. }
  34.  
  35. int main() {
  36.  
  37.     ios_base::sync_with_stdio(0); cin.tie(0);
  38.     #ifndef ONLINE_JUDGE
  39.     freopen("input.txt", "r", stdin);
  40.     freopen("output.txt", "w", stdout);
  41.     #endif
  42.     cin >> n >> q >> k;
  43.     for(int i = 0; i < n; i++) {
  44.         cin >> arr[i];
  45.         arr[i] %= k;
  46.     }
  47.     Build();
  48.     while(q--) {
  49.         int l,r,type;
  50.         cin >> type >> l >> r;
  51.         if(type == 1) {
  52.             int ans = query(l/Sz+1,r/Sz-1);
  53.             int b1 = l / Sz,b2 = r / Sz;
  54.             for(int i = l; i / Sz == b1 && i <=r; i++) {
  55.                 if((to_add[i/Sz] + arr[i])%k == 0) ans ++;
  56.             }
  57.             if(b1 != b2)
  58.                 for(int i = r; i / Sz == b2 && i >= 0; i--) {
  59.                     if((to_add[i/Sz] + arr[i])%k == 0) ans ++;
  60.                 }
  61.             cout << ans << "\n";
  62.         }
  63.         else {
  64.             int val;
  65.             cin >> val;
  66.             int b1 = l / Sz,b2 = r / Sz;
  67.             update(b1+1,b2-1,val);
  68.             for(int i = l; i / Sz == b1 && i <=r; i++) {
  69.                     sum[i/Sz][arr[i]] --;
  70.                     arr[i] += val;
  71.                     arr[i] %= k;
  72.                     sum[i/Sz][arr[i]] ++;
  73.             }
  74.             if(b1 != b2)
  75.                 for(int i = r; i / Sz == b2 && i >= 0; i--) {
  76.                     sum[i/Sz][arr[i]] --;
  77.                     arr[i] += val;
  78.                     arr[i] %= k;
  79.                     sum[i/Sz][arr[i]] ++;
  80.                 }
  81.         }
  82.     }
  83.     return 0;
  84. }
  85.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement