Advertisement
Galebickosikasa

Untitled

May 14th, 2020
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.44 KB | None | 0 0
  1. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  2. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
  3. // #pragma comment(linker, "/stack:200000000"]
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <set>
  12. #include <map>
  13. #include <queue>
  14. #include <deque>
  15. #include <bitset>
  16. #include <stack>
  17. #include <random>
  18. #include <fstream>
  19. #include <sstream>
  20. #include <chrono>
  21.  
  22. #define fi first
  23. #define se second
  24. #define pb push_back
  25. #define ll long long
  26. #define ld long double
  27. #define hm unordered_map
  28. #define pii pair<int, int>
  29. #define sz(a) (int)a.size()
  30. #define all(a) a.begin(), a.end()
  31. #define cinv(v) for (auto& x: v) cin >> x
  32. #define fr(i, n) for (int i = 0; i < n; ++i)
  33. #define fl(i, l, n) for (int i = l; i < n; ++i)
  34.  
  35. #define int ll
  36.  
  37. using namespace std;
  38.  
  39. #ifdef __LOCAL
  40. #define dbg(x) cerr << #x << " : " << x << '\n'
  41. const int maxn = 20;
  42. #else
  43. #define dbg(x)
  44. const int maxn = 2e5 + 20;
  45. #endif
  46.  
  47. //tg: @galebickosikasa
  48.  
  49. const ll inf = (ll) 2e9;
  50. const ld pi = asin (1) * 2;
  51. const ld eps = 1e-8;
  52. const ll mod = (ll)1e9 + 7;
  53. const ll ns = 97;
  54.  
  55. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  56.  
  57. struct Tree {
  58. vector<int> t, assign;
  59. int size = 0, capacity;
  60.  
  61. Tree (vector<int>& v) {
  62. while ((1<<size) < sz (v)) ++size;
  63. ++size;
  64. size = (1<<size);
  65. capacity = (size>>1);
  66. t = vector<int> (size);
  67. assign = vector<int> (size, -1);
  68. fr (i, sz (v)) t[i + capacity] = v[i];
  69. for (int i = capacity - 1; i > 0; --i) t[i] = t[i * 2] + t[i * 2 + 1];
  70. }
  71.  
  72. void push (int cur) {
  73. if (assign[cur] == -1) return;
  74. assign[cur * 2] = assign[cur * 2 + 1] = assign[cur];
  75. assign[cur] = -1;
  76. }
  77.  
  78. void render (int cur, int L) {
  79. int a, b;
  80. L /= 2;
  81. if (assign[cur * 2] != -1) a = assign[cur * 2] * L;
  82. else a = t[cur * 2];
  83. if (assign[cur * 2 + 1] != -1) b = assign[cur * 2 + 1] * L;
  84. else b = t[cur * 2 + 1];
  85. t[cur] = a + b;
  86. }
  87.  
  88. int get (int cur, int left, int right, int l, int r) {
  89. if (cur >= size) return 0;
  90. else if (left > r || right < l) return 0;
  91. else if (l <= left && r >= right) {
  92. if (assign[cur] != -1) return assign[cur] * (left - right + 1);
  93. else return t[cur];
  94. } else {
  95. push (cur);
  96. int ans = get (cur * 2, left, (left + right) / 2, l, r) + get (cur * 2 + 1, (left + right) / 2 + 1, right, l, r);
  97. render (cur, right - left + 1);
  98. return ans;
  99. }
  100. }
  101.  
  102.  
  103. int get (int l, int r) {
  104. return get (1, 0, capacity - 1, l, r);
  105. }
  106.  
  107. void set (int cur, int left, int right, int l, int r, int x) {
  108. if (cur >= size) return;
  109. else if (left > r || right < l) return;
  110. else if (l <= left && r >= right) assign[cur] = x;
  111. else {
  112. push (cur);
  113. set (cur * 2, left, (left + right) / 2, l, r, x), set (cur * 2 + 1, (left + right) / 2 + 1, right, l, r, x);
  114. render (cur, right - left + 1);
  115. }
  116. }
  117.  
  118. void set (int l, int r, int x) {
  119. set (1, 0, capacity, l, r, x);
  120. }
  121.  
  122. };
  123.  
  124.  
  125. signed main () {
  126. ios_base::sync_with_stdio(false);
  127. cin.tie(nullptr);
  128. cout.tie(nullptr);
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement