Guest User

Untitled

a guest
Jul 20th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define _ << " _ " <<
  5. #define TRACE(x) cout << #x << " = " << x << endl
  6.  
  7. typedef long long ll;
  8.  
  9. const int MaxN = 1e5 + 10, Off = 1 << 17;
  10. int n, q, k;
  11.  
  12. struct SegTree {
  13. vector<ll> v[2 * Off];
  14. ll sum[2 * Off];
  15. int lazy[2 * Off];
  16.  
  17. void update_sum(int i) {
  18. if (k == 1) {
  19. sum[i] = sum[2 * i] + sum[2 * i + 1];
  20. return;
  21. }
  22.  
  23. sum[i] = 0;
  24. ll w = 1;
  25.  
  26. for (ll x : v[i]) {
  27. sum[i] += x * w;
  28. w *= k;
  29. }
  30. }
  31.  
  32. void propagate(int i) {
  33. if (k == 1) return;
  34.  
  35. if (lazy[i] == 0) return;
  36.  
  37. v[i].erase(v[i].begin(), v[i].begin() + min(lazy[i], (int)v[i].size()));
  38.  
  39. update_sum(i);
  40.  
  41. if (i >= Off) {
  42. lazy[i] = 0;
  43. return;
  44. }
  45.  
  46. lazy[2 * i] += lazy[i];
  47. lazy[2 * i + 1] += lazy[i];
  48.  
  49. lazy[i] = 0;
  50. }
  51.  
  52. void update(int i) {
  53. if (k == 1) {
  54. update_sum(i);
  55. return;
  56. }
  57.  
  58. v[i].resize(max(v[2 * i].size(), v[2 * i + 1].size()));
  59.  
  60. for (int j = 0; j < (int)v[i].size(); j++) {
  61. v[i][j] = 0;
  62. if (j < (int)v[2 * i].size()) v[i][j] += v[2 * i][j];
  63. if (j < (int)v[2 * i + 1].size()) v[i][j] += v[2 * i + 1][j];
  64. }
  65.  
  66. update_sum(i);
  67. }
  68.  
  69. void update_leaf(int j, int val, int i = 1, int lo = 0, int hi = Off) {
  70. propagate(i);
  71.  
  72. if (j < lo || hi <= j) return;
  73.  
  74. if (j + Off == i) {
  75. sum[i] = val;
  76. if (k == 1) return;
  77.  
  78. v[i].resize(0);
  79. while (val > 0) {
  80. v[i].push_back(val % k);
  81. val /= k;
  82. }
  83. } else {
  84. int mid = (lo + hi) / 2;
  85. update_leaf(j, val, 2 * i, lo, mid);
  86. update_leaf(j, val, 2 * i + 1, mid, hi);
  87.  
  88. update(i);
  89. }
  90. }
  91.  
  92. void update_interval(int l, int r, int i = 1, int lo = 0, int hi = Off) {
  93. propagate(i);
  94.  
  95. if (r <= lo || hi <= l) return;
  96.  
  97. if (l <= lo && hi <= r) {
  98. lazy[i] = 1;
  99. propagate(i);
  100. } else {
  101. int mid = (lo + hi) / 2;
  102. update_interval(l, r, 2 * i, lo, mid);
  103. update_interval(l, r, 2 * i + 1, mid, hi);
  104.  
  105. update(i);
  106. }
  107. }
  108.  
  109. ll query(int l, int r, int i = 1, int lo = 0, int hi = Off) {
  110. propagate(i);
  111.  
  112. if (r <= lo || hi <= l) return 0;
  113. if (l <= lo && hi <= r) return sum[i];
  114.  
  115. int mid = (lo + hi) / 2;
  116. return query(l, r, 2 * i, lo, mid) + query(l, r, 2 * i + 1, mid, hi);
  117. }
  118. } T;
  119.  
  120.  
  121. int main() {
  122. ios_base::sync_with_stdio(false);
  123. cin.tie(0);
  124.  
  125. cin >> n >> q >> k;
  126.  
  127. for (int i = 0; i < n; i++) {
  128. int c;
  129. cin >> c;
  130.  
  131. T.update_leaf(i, c);
  132. }
  133.  
  134. for (int i = 0; i < q; i++) {
  135. int s, t, u;
  136. cin >> s >> t >> u;
  137. t--;
  138.  
  139. if (s == 1) T.update_leaf(t, u);
  140. if (s == 2) T.update_interval(t, u);
  141. if (s == 3) cout << T.query(t, u) << "\n";
  142. }
  143.  
  144. return 0;
  145. }
Add Comment
Please, Sign In to add comment