Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. typedef long long ll;
  4. using namespace std;
  5. ll arr[5000001];
  6.  
  7. void build(ll l, ll r) {
  8.     if (l != 0) {
  9.         for (int i = l; i < r - 1; i = i + 2) {
  10.             arr[i / 2] = arr[i] + arr[i + 1];
  11.         }
  12.         build(l / 2, r / 2);
  13.     }
  14. }
  15.  
  16. ll sum(ll position, ll left_now, ll right_now, ll a, ll b) { // [a,b] границы нашего массива
  17.     if (a > right_now || b < left_now)
  18.         return 0;
  19.     if (left_now >= a && right_now <= b) {
  20.         return arr[position];
  21.     }
  22.     ll middle = (left_now + right_now) / 2;
  23.     return sum(2 * position + 1, left_now, middle, a, b) + sum(2 * position + 2, middle + 1, right_now, a, b);
  24. }
  25.  
  26. void set_value(ll i, ll value) { // [a,b] наш отрезок
  27.     arr[i] = value;
  28.     ll z = i;
  29.     while (z != 0) {
  30.         z = (z - 1) / 2;
  31.         arr[z] = arr[2 * z + 1] + arr[2 * z + 2];
  32.     }
  33. }
  34.  
  35. int main() {
  36.     ll n;
  37.     cin >> n;
  38.     ll p = ceil(log2(n));
  39.     for (int i = 0; i < n; i++) {
  40.         cin >> arr[i + (1 << p) - 1];
  41.     }
  42.     build((1 << p) - 1, (1 << (p + 1)));
  43.     string s;
  44.     ll i, x;
  45.     while (cin >> s >> i >> x) {
  46.         if (s == "set") {
  47.             set_value((1 << p) - 2 + i, x);
  48. //            for (int i = 0; i < (1<<p+1); i++) {
  49. //                cout << arr[i] << " ";
  50. //            }
  51.         } else {
  52.             cout << sum(0, 0, (1 << p) - 1, i - 1, x - 1) << endl;
  53.         }
  54.     }
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement