Advertisement
Galebickosikasa

Untitled

Nov 20th, 2020
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.22 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. template <typename T1, typename T2> inline bool chkmin(T1 &x, const T2 &y) {if (x > y) {x = y; return 1;} return 0;}
  38. template <typename T1, typename T2> inline bool chkmax(T1 &x, const T2 &y) {if (x < y) {x = y; return 1;} return 0;}
  39.  
  40. using namespace std;
  41.  
  42. #ifdef LOCAL
  43. #define dbg(x) cerr << #x << " : " << x << '\n'
  44. const int maxn = 20;
  45. #else
  46. #define dbg(x)
  47. const int maxn = 2e5 + 20;
  48. #endif
  49.  
  50. //tg: @galebickosikasa
  51.  
  52. ostream& operator << (ostream& out, vector<int>& v) {
  53. for (auto& x: v) out << x << ' ';
  54. return out;
  55. }
  56.  
  57. ostream& operator << (ostream& out, pii& v) {
  58. out << v.fi << ", " << v.se;
  59. return out;
  60. }
  61.  
  62. istream& operator >> (istream& in, pii& a) {
  63. in >> a.fi >> a.se;
  64. return in;
  65. }
  66.  
  67. const ll inf = (ll) 2e9;
  68. const ld pi = asin (1) * 2;
  69. const ld eps = 1e-8;
  70. const ll mod = (ll)1e9 + 7;
  71. const ll ns = 97;
  72.  
  73. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  74.  
  75. struct tree {
  76. vector<int> sum, mn, assign;
  77. int size = 0, capacity;
  78.  
  79. tree (vector<int>& v) {
  80. while ((1<<size) < sz (v)) ++size;
  81. ++size;
  82. size = (1<<size);
  83. capacity = (size>>1);
  84. sum = vector<int> (size);
  85. mn = vector<int> (size, inf);
  86. assign = vector<int> (size, -1);
  87. fr (i, sz (v)) {
  88. sum[i + capacity] = v[i];
  89. mn[i + capacity] = v[i];
  90. }
  91. for (int i = capacity - 1; i > 0; --i) {
  92. sum[i] = sum[i * 2] + sum[i * 2 + 1];
  93. mn[i] = min (mn[i * 2], mn[i * 2 + 1]);
  94. }
  95. }
  96.  
  97. inline void push (int cur) {
  98. if (assign[cur] == -1) return;
  99. assign[cur * 2] = assign[cur * 2 + 1] = assign[cur];
  100. assign[cur] = -1;
  101. }
  102.  
  103. inline void render (int cur, int sz) {
  104. sum[cur] = 0, mn[cur] = inf;
  105. if (assign[cur * 2] == -1) {
  106. sum[cur] += sum[cur * 2];
  107. chkmin (mn[cur], mn[cur * 2]);
  108. } else {
  109. sum[cur] += assign[cur * 2] * sz / 2;
  110. chkmin (mn[cur], assign[cur * 2]);
  111. }
  112. if (assign[cur * 2 + 1] == -1) {
  113. sum[cur] += sum[cur * 2 + 1];
  114. chkmin (mn[cur], mn[cur * 2 + 1]);
  115. } else {
  116. sum[cur] += assign[cur * 2 + 1] * sz / 2;
  117. chkmin (mn[cur], assign[cur * 2 + 1]);
  118. }
  119. }
  120.  
  121. void set (int cur, int left, int right, int l, int r, int x) {
  122. if (cur >= size) return;
  123. if (left > r || right < l) return;
  124. if (l <= left && r >= right) assign[cur] = x;
  125. else {
  126. push (cur);
  127. set (cur * 2, left, (left + right) / 2, l, r, x);
  128. set (cur * 2 + 1, (left + right) / 2 + 1, right, l, r, x);
  129. render (cur, right - left + 1);
  130. }
  131. }
  132.  
  133. void set (int l, int r, int x) {
  134. set (1, 0, capacity - 1, l, r, x);
  135. }
  136.  
  137. int firstLess (int cur, int x, int sz) {
  138. if (sz == 1) return cur - capacity;
  139. push (cur);
  140. int ans = inf;
  141. if (assign[cur * 2] == -1) {
  142. if (mn[cur * 2] < x) ans = firstLess (cur * 2, x, (sz >> 1));
  143. } else {
  144. if (assign[cur * 2] < x) ans = firstLess (cur * 2, x, (sz >> 1));
  145. }
  146. if (ans == inf) {
  147. if (assign[cur * 2 + 1] == -1) {
  148. if (mn[cur * 2 + 1] < x) ans = firstLess (cur * 2 + 1, x, (sz >> 1));
  149. } else {
  150. if (assign[cur * 2 + 1] < x) ans = firstLess (cur * 2 + 1, x, (sz >> 1));
  151. }
  152. }
  153. render (cur, sz);
  154. return ans;
  155. }
  156.  
  157. void get (int cur, int left, int right, int l, int r, int& s, int& cnt) {
  158. if (cur >= size) return;
  159. if (left > r || right < l) return;
  160. if (assign[cur] == -1) {
  161. if (mn[cur] > s) return;
  162. if (l <= left && r >= right && sum[cur] <= s) {
  163. s -= sum[cur];
  164. cnt += right - left + 1;
  165. return;
  166. }
  167. } else {
  168. if (assign[cur] > s) return;
  169. if (l <= left && r >= right && assign[cur] * (right - left + 1) <= s) {
  170. s -= assign[cur] * (right - left + 1);
  171. cnt += right - left + 1;
  172. return;
  173. }
  174. }
  175. push (cur);
  176. get (cur * 2, left, (left + right) / 2, l, r, s, cnt);
  177. get (cur * 2 + 1, (left + right) / 2 + 1, right, l, r, s, cnt);
  178. render (cur, right - left + 1);
  179. }
  180.  
  181. void get (int l, int r, int& s, int& cnt) {
  182. get (1, 0, capacity - 1, l, r, s, cnt);
  183. }
  184. };
  185.  
  186. signed main () {
  187. ios_base::sync_with_stdio(false);
  188. cin.tie(nullptr);
  189. cout.tie(nullptr);
  190. int n, q;
  191. cin >> n >> q;
  192. vector<int> goo (n);
  193. cinv (goo);
  194. tree t (goo);
  195. while (q--) {
  196. int qs;
  197. cin >> qs;
  198. if (qs == 1) {
  199. int r, y;
  200. cin >> r >> y;
  201. --r;
  202. int l = t.firstLess (1, y, t.capacity);
  203. if (l <= r) t.set (l, r, y);
  204. } else {
  205. int x, y;
  206. cin >> x >> y;
  207. --x;
  208. int cnt = 0;
  209. t.get (x, n - 1, y, cnt);
  210. cout << cnt << '\n';
  211. }
  212. }
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219. }
  220.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement