fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9.  
  10. const int N = 1e5 + 5;
  11.  
  12. int n, q;
  13.  
  14. ll seg[4 * N];
  15.  
  16. // void build(int id, int l, int r) { // O(n)
  17. // if (l == r) {
  18. // seg[id] = a[l];
  19. // return;
  20. // }
  21. // int mid = (l + r) >> 1;
  22. // build(id * 2, l, mid);
  23. // build(id * 2 + 1, mid + 1, r);
  24. // seg[id] = seg[id * 2] + seg[id * 2 + 1];
  25. // }
  26.  
  27. void update(int id, int l, int r, int pos, int val) { // O(log2(n))
  28. // đoạn [l, r] không liên quan gì đến vị trí cần update
  29. if (l > pos || r < pos) return;
  30.  
  31. // đoạn [l, r] chứa pos
  32.  
  33. if (l == r) {
  34. seg[id] = val;
  35. return;
  36. }
  37.  
  38. int mid = (l + r) >> 1;
  39. update(id * 2, l, mid, pos, val);
  40. update(id * 2 + 1, mid + 1, r, pos, val);
  41.  
  42. seg[id] = seg[id * 2] + seg[id * 2 + 1];
  43. }
  44.  
  45. ll get(int id, int l, int r, int u, int v) { // O(log2(n))
  46. // [l, r] không liên quan gì đến đoạn cần truy vấn [u, v]
  47. if (l > v || r < u) return 0;
  48.  
  49. // [l, r] nằm trọn trong [u, v]
  50. if (u <= l && r <= v) return seg[id];
  51.  
  52. // [l, r] giao một phần với [u, v]
  53. int mid = (l + r) >> 1;
  54. return get(id * 2, l, mid, u, v) + get(id * 2 + 1, mid + 1, r, u, v);
  55. }
  56.  
  57. int main() {
  58. ios::sync_with_stdio(0); cin.tie(0);
  59. cin >> n >> q;
  60.  
  61. while (q--) {
  62. int type; cin >> type;
  63.  
  64. if (type == 1) {
  65. int x, y;
  66. cin >> x >> y;
  67. update(1, 1, n, x, y);
  68. }
  69. else {
  70. int l, r;
  71. cin >> l >> r;
  72. cout << get(1, 1, n, l, r) << '\n';
  73. }
  74. }
  75. }
  76.  
Success #stdin #stdout 0.01s 5276KB
stdin
5 8
1 1 2
1 3 5
2 1 3
1 5 4
2 1 5
1 4 3
1 3 5
2 1 4
stdout
7
11
10