fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 2e5 + 5;
  4. const int LG = 30;
  5. int n, q;
  6. int a[MAXN];
  7.  
  8. int H[MAXN * LG];
  9. long long st[MAXN * LG];
  10. int L[MAXN * LG], R[MAXN * LG];
  11. int node = 0;
  12.  
  13. int up(int old, int l, int r, int pos, int val){
  14. int cur = ++ node;
  15. if(l == r){
  16. st[cur] = val;
  17. return cur;
  18. }
  19. int mid = l + r >> 1;
  20. if(pos <= mid){
  21. R[cur] = R[old];
  22. L[cur] = up(L[old], l, mid, pos, val);
  23. } else{
  24. L[cur] = L[old];
  25. R[cur] = up(R[old], mid + 1, r, pos, val);
  26. }
  27. st[cur] = st[L[cur]] + st[R[cur]];
  28. return cur;
  29. }
  30.  
  31. long long get(int id, int l, int r, int u, int v){
  32. if(l > v || r < u) return 0;
  33. if(l >= u && r <= v) return st[id];
  34. int mid = l + r >> 1;
  35. return get(L[id], l, mid, u, v) + get(R[id], mid + 1, r, u, v);
  36. }
  37.  
  38. signed main(){
  39. ios_base::sync_with_stdio(false);
  40. cin.tie(nullptr);
  41.  
  42. cin >> n >> q;
  43. for(int i = 1; i <= n; i++) cin >> a[i];
  44.  
  45. for(int i = 1; i <= n; i++){
  46. H[1] = up(H[1], 1, n, i, a[i]);
  47. }
  48. int vers = 1;
  49.  
  50. while(q--){
  51. int t; cin >> t;
  52. if(t == 1){
  53. int id, val, x; cin >> x >> id >> val;
  54. H[x] = up(H[x], 1, n, id, val);
  55. }
  56. if(t == 2){
  57. int k, l, r; cin >> k >> l >> r;
  58. cout << get(H[k], 1, n, l, r) << "\n";
  59. }
  60. if(t == 3){
  61. int k; cin >> k;
  62. H[vers + 1] = H[k];
  63. vers++;
  64. }
  65. }
  66.  
  67. return 0;
  68. }
  69. /*
  70. 5 6
  71. 2 3 1 2 5
  72. 3 1
  73. 2 1 1 5
  74. 2 2 1 5
  75. 1 2 2 5
  76. 2 1 1 5
  77. 2 2 1 5
  78. */
  79.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Standard output is empty