fork(2) download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. /* построение дерева */
  5. void build (int tree[], int arr[], int v, int left, int right) {
  6. if (left == right) {
  7. tree[v] = arr[left];
  8. }
  9. else {
  10. int middle = (left + right) / 2;
  11. build (tree, arr, v*2, left, middle);
  12. build (tree, arr, v*2+1, middle+1, right);
  13. tree[v] = tree[v*2] + tree[v*2+1];
  14. }
  15. }
  16.  
  17. /* запрос суммы */
  18. int sum (int tree[], int v, int left, int right, int from, int to) {
  19. if (from > to) {
  20. return 0;
  21. }
  22. if (from == left && to == right) {
  23. return tree[v];
  24. }
  25. int middle = (left + right) / 2;
  26. return sum (tree, v*2, left, middle, from, min(to,middle))
  27. + sum (tree, v*2+1, middle+1, right, max(from,middle+1), to);
  28. }
  29.  
  30. /* операция присваивания*/
  31. void update (int tree[], int v, int left, int right, int index, int new_val) {
  32. if (left == right) {
  33. tree[v] = new_val;
  34. }
  35. else {
  36. int middle = (left + right) / 2;
  37. if (index <= middle) {
  38. update (tree, v*2, left, middle, index, new_val);
  39. }
  40. else {
  41. update (tree, v*2+1, middle+1, right, index, new_val);
  42. }
  43. tree[v] = tree[v*2] + tree[v*2+1];
  44. }
  45. }
  46. int main() {
  47. int n, q, i, d, from, to;
  48. char query;
  49. cin >> n >> q;
  50. int size = 2*n; /* максимальный размер дерева*/
  51. int arr[n+1], tree[size];
  52. for(int i = 0; i < n; i++){
  53. cin >> arr[i];
  54. }
  55. build(tree, arr, 1, 0, n-1); /* передаем функции построения массив для записи
  56. дерева, исходный массив, корень и границы отрезка,
  57.   принадлежащего корню*/
  58. for (q; q>0; q--) {
  59. cin >> query;
  60. if(query == '=') {
  61. cin >> i >> d;
  62. update(tree, 1, 0, n-1, i-1, d);
  63. }
  64. else if (query == '?') {
  65. cin >> from >> to;
  66. cout << sum(tree, 1, 0, n-1, from-1, to-1) << endl;
  67. }
  68.  
  69. }
  70.  
  71. return 0;
  72. }
Success #stdin #stdout 0s 3464KB
stdin
5 6
1 2 3 4 5
? 1 5
= 1 0
? 1 5
= 2 7
? 1 5
? 1 3
stdout
15
14
19
10