Advertisement
yeskendir_sultanov

Присвоение на отрезке и сумма на отрезке

Apr 7th, 2025
450
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3.  
  4. using namespace std;
  5.  
  6. ll n, k, q;
  7. vector<ll> a, b, add;
  8.  
  9. void push(int id) {
  10.     if (add[id] != -1) {
  11.         b[id] = 0;
  12.         for (int i = id * k; i < min((id + 1) * k, n); ++i) {
  13.             a[i] = add[id];
  14.             b[id] += a[i];
  15.         }
  16.         add[id] = -1;
  17.     }
  18. }
  19.  
  20. void update(int l, int r, ll x) {
  21.     int bl = l / k, br = r / k;
  22.     if (bl != br) {
  23.         push(bl);
  24.         push(br);
  25.        
  26.         for (int i = l; i < (bl + 1) * k; i++) {
  27.             b[bl] -= a[i];
  28.             a[i] = x;
  29.             b[bl] += a[i];
  30.         }
  31.         for (int i = br * k; i <= r; ++i) {
  32.             b[br] -= a[i];
  33.             a[i] = x;
  34.             b[br] += a[i];
  35.         }
  36.         for (int i = bl + 1; i < br; ++i) {
  37.             b[i] = k * x;
  38.             add[i] = x;
  39.         }
  40.     } else {
  41.         push(bl);
  42.        
  43.         for (int i = l; i <= r; ++i) {
  44.             b[i / k] -= a[i];
  45.             a[i] = x;
  46.             b[i / k] += a[i];
  47.         }
  48.     }
  49. }
  50.  
  51. ll sum(int l, int r) {
  52.     int bl = l / k, br = r / k;
  53.    
  54.     ll res = 0;
  55.    
  56.     if (bl != br) {
  57.         push(bl);
  58.         push(br);
  59.        
  60.         for (int i = l; i < (bl + 1) * k; ++i) {
  61.             res += a[i];
  62.         }
  63.         for (int i = br * k; i <= r; ++i) {
  64.             res += a[i];
  65.         }
  66.         for (int i = bl + 1; i < br; ++i) {
  67.             res += b[i];
  68.         }
  69.     } else {
  70.         push(bl);
  71.        
  72.         for (int i = l; i <= r; ++i) {
  73.             res += a[i];
  74.         }    
  75.     }
  76.    
  77.     return res;
  78. }
  79.  
  80. int main() {
  81.     freopen("sum.in", "r", stdin);
  82.     freopen("sum.out", "w", stdout);
  83.     cin >> n >> q;
  84.     a.resize(n);
  85.     k = int(sqrt(n) + 0.99);
  86.     b.resize(k + 1, 0);
  87.     add.resize(k + 1, -1);
  88.    
  89.     while (q--) {
  90.         char op;
  91.         int l, r;
  92.         cin >> op >> l >> r;
  93.         l--; r--;
  94.         if (op == 'A') {
  95.             int x;
  96.             cin >> x;
  97.             update(l, r, x);
  98.         } else {
  99.             cout << sum(l, r) << endl;
  100.         }
  101.     }
  102.    
  103.     return 0;
  104. }
  105.  
  106.  
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement