Advertisement
Guest User

Untitled

a guest
Aug 21st, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cmath>
  5. #include <iomanip>
  6. #include <cstdlib>
  7. #include <climits>
  8. int my_array[100000];
  9. int tree_segments[400000];
  10.  
  11. using namespace std;
  12.  
  13. void build(int A[], int number, int left, int right) {
  14. if (left == right)
  15. tree_segments[number] = A[left];
  16. else {
  17. int middle = (left + right) / 2;
  18. build(A, number * 2 + 1, left, middle);
  19. build(A, number * 2 + 2, middle + 1, right);
  20. tree_segments[number] = tree_segments[number * 2 + 1] +
  21. tree_segments[number * 2 + 2];
  22. }
  23. }
  24. long long get_sum(int number, int left, int right, int need_left, int need_right) {
  25. if (need_left > need_right)
  26. return 0;
  27. if (need_left == left && need_right == right)
  28. return tree_segments[number];
  29. int middle = (left + right) / 2;
  30. return get_sum(number * 2 + 1, left, middle, need_left, min(middle, need_right)) +
  31. get_sum(number * 2 + 2, middle + 1, right, max(middle + 1, need_left), need_right);
  32.  
  33. }
  34.  
  35. void update(int position, int new_val, int size) {
  36. int number = 0;
  37. int left = 0;
  38. int right = size - 1;
  39. while (position != right || position != left) {
  40. int middle = (left + right) / 2;
  41. if (position > middle) {
  42. left = middle + 1;
  43. number = number * 2 + 2;
  44. }
  45. else {
  46. right = middle;
  47. number = number * 2 + 1;
  48. }
  49. }
  50. tree_segments[number] = new_val;
  51. }
  52. int main() {
  53. freopen("input.txt", "r", stdin);
  54. int n, amount_reqst;
  55. cin >> n;
  56. for (int i = 0; i < n; i++) {
  57. int current_element;
  58. cin >> current_element;
  59. my_array[i] = current_element;
  60. }
  61. build(my_array, 0, 0, n - 1);
  62.  
  63. cin >> amount_reqst;
  64. for (int i = 0; i < amount_reqst; i++) {
  65. char type_of_reqst;
  66. cin >> type_of_reqst;
  67. if (type_of_reqst == 's') {
  68. int left, right;
  69. cin >> left >> right;
  70. cout << get_sum(0, 0, n - 1, left, right) << ' ';
  71. }
  72. if (type_of_reqst == 'u') {
  73. int position, new_val;
  74. cin >> position >> new_val;
  75. update(position, new_val, n);
  76. }
  77. }
  78.  
  79. return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement