DSA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
2.3 KiB

  1. /*
  2. #pragma GCC target ("avx2")
  3. #pragma GCC optimize ("Ofast")
  4. #pragma GCC optimize ("unroll-loops")
  5. */
  6. #include "bits/stdc++.h"
  7. #define iosb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)
  8. #define BIT(x) __builtin_popcount(x)
  9. #define all(x) x.begin() , x.end()
  10. #define F first
  11. #define S second
  12. #define pb push_back
  13. using namespace std ;
  14. typedef unsigned long long UL ;
  15. typedef long long L ;
  16. typedef string T ;
  17. typedef int I ;
  18. const I MaxN = 1e5+1 ;
  19. const I MOD = 1e9+7 ;
  20. const I inf = 2e9+7 ;
  21. const L INF = 2e18+7 ;
  22. int t[4*MaxN], mod[4*MaxN], a[MaxN], n ;
  23. void build(int v, int tl, int tr)
  24. {
  25. if(tl == tr)
  26. {
  27. t[v] = a[tl] ;
  28. return ;
  29. }
  30. int tm = (tl + tr) >> 1 ;
  31. build(v*2, tl, tm) ;
  32. build(v*2+1, tm+1, tr) ;
  33. t[v] = t[v*2] + t[v*2+1] ;
  34. }
  35. void push(int v, int tl, int tr)
  36. {
  37. if(mod[v] != 0 && v*2+1 < 4*MaxN)
  38. {
  39. mod[v*2] = mod[v*2+1] = mod[v] ;
  40. mod[v] = 0 ;
  41. int tm = (tl + tr) >> 1 ;
  42. t[v*2] = (tm-tl+1) * mod[v*2] ;
  43. t[v*2+1] = (tr-tm) * mod[v*2+1] ;
  44. }
  45. }
  46. void update(int v, int tl, int tr, int l, int r, int x)
  47. {
  48. if(l <= tl && tr <= r)
  49. {
  50. t[v] = x * (tr-tl+1) ;
  51. mod[v] = x ;
  52. return ;
  53. }
  54. if(tr < l || r < tl)
  55. return ;
  56. push(v, tl, tr) ;
  57. int tm = (tl + tr) >> 1 ;
  58. update(v*2, tl, tm, l, r, x) ;
  59. update(v*2+1, tm+1, tr, l, r, x) ;
  60. t[v] = t[v*2] + t[v*2+1] ;
  61. }
  62. int get(int v, int tl, int tr, int l, int r)
  63. {
  64. if(l <= tl && tr <= r)
  65. return t[v] ;
  66. if(l > tr || r < tl)
  67. return 0 ;
  68. push(v, tl, tr) ;
  69. int tm = (tl + tr) >> 1 ;
  70. return get(v*2, tl, tm, l, r) + get(v*2+1, tm+1, tr, l, r) ;
  71. }
  72. int32_t main(int argc, char *argv[])
  73. {
  74. if(argc > 1)
  75. freopen(argv[1], "r", stdin) ;
  76. //freopen(".in" , "r" , stdin) ;
  77. //freopen(".out" , "w" , stdout) ;
  78. cin >> n ;
  79. for(int i = 1 ; i <= n ; ++i)
  80. cin >> a[i] ;
  81. build(1, 1, n) ;
  82. int t ;
  83. cin >> t ;
  84. while(t--)
  85. {
  86. int type, l, r, x ;
  87. cin >> type ;
  88. if(type == 1)
  89. {
  90. cin >> l >> r >> x ;
  91. update(1, 1, n, l, r, x) ;
  92. }
  93. else
  94. {
  95. cin >> l >> r ;
  96. cout << get(1, 1, n, l, r) << '\n' ;
  97. }
  98. }
  99. }