lalalalalalalaalalla

Untitled

Feb 3rd, 2021
786
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <algorithm>
  4. #include <bitset>
  5. #include <set>
  6. #include <unordered_set>
  7. #include <map>
  8. #include <unordered_map>
  9. #include <cmath>
  10. #include <time.h>
  11. #include <random>
  12. #include <string>
  13. #include <cassert>
  14. #include <vector>
  15. #include <ostream>
  16. #include <istream>
  17. #include <stack>
  18. #include <deque>
  19. #include <queue>
  20. #include <functional>
  21. #include <chrono>
  22. #include <stack>
  23. #include <limits>
  24.  
  25. using namespace std;
  26.  
  27. #define int long long
  28. #define pb push_back
  29. #define all(a) (a).begin(), (a).end()
  30. #define pii pair<int, int>
  31. #define ld long double
  32.  
  33. istream& operator>> (istream& in, pii& b) {
  34.     in >> b.first >> b.second;
  35.     return in;
  36. }
  37.  
  38. ostream& operator<< (ostream& out, const pii& b) {
  39.     out << "{" << b.first << ", " << b.second << "}";
  40.     return out;
  41. }
  42.  
  43. template<typename T> ostream& operator<< (ostream& out, const vector<T>& a) {
  44.     for (auto k : a) out << k << " ";
  45.     return out;
  46. }
  47.  
  48. template <typename T1, typename T2> inline bool chkmin(T1 &x, const T2 &y) {if (x > y) {x = y; return 1;} return 0;}
  49. template <typename T1, typename T2> inline bool chkmax(T1 &x, const T2 &y) {if (x < y) {x = y; return 1;} return 0;}
  50.  
  51. #ifdef LOCAL
  52.     #define dbg(x) cout << #x << " : " << (x) << endl;
  53.     const long long INF = 1e18;
  54.     // const long long mod = 2600000069;
  55.     // const long long p = 10;
  56. #else
  57.     #define dbg(x) 57
  58.     const long long INF = 1e18;
  59.     // const long long mod = 2600000069;  
  60.     // const long long p = 179;
  61. #endif
  62.  
  63. const ld PI = 4 * atan(1);
  64.  
  65. #define time clock() / (double) CLOCKS_PER_SEC
  66.  
  67. // #pragma GCC optimize("Ofast,no-stack-protector")
  68. // #pragma GCC target("sse,sse2,sse3,sse3,sse4")
  69. // #pragma GCC optimize("unroll-loops")
  70. // #pragma GCC optimize("fast-math")
  71. // #pragma GCC target("avx2")
  72.  
  73. mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
  74.  
  75. #ifdef LOCAL
  76.     const int N = 5010;
  77. #else
  78.     const int N = 301000;
  79. #endif
  80.  
  81. int n, q;
  82. int a[N];
  83.  
  84. // first segtree
  85.  
  86. int t1[8 * N], mod1[8 * N];
  87.  
  88. int real1(int v, int l, int r) {
  89.     if (mod1[v] != -1) {
  90.         return mod1[v] * (r - l);
  91.     }
  92.     return t1[v];
  93. }
  94.  
  95. void push1(int v, int l, int r) {
  96.     if (mod1[v] != -1) {
  97.         t1[v] = (r - l) * mod1[v];
  98.         mod1[2 * v + 1] = mod1[v];
  99.         mod1[2 * v + 2] = mod1[v];
  100.         mod1[v] = -1;
  101.     }
  102. }
  103.  
  104. void build1(int v, int l, int r) {
  105.     mod1[v] = -1;
  106.     if (l + 1 == r) {
  107.         t1[v] = !a[l];
  108.         return;
  109.     }
  110.     int m = (l + r) / 2;
  111.     build1(2 * v + 1, l, m);
  112.     build1(2 * v + 2, m, r);
  113.     t1[v] = t1[2 * v + 1] + t1[2 * v + 2];
  114. }
  115.  
  116. int sum1(int v, int l, int r, int askl, int askr) {
  117.     push1(v, l, r);
  118.     if (l >= askr || r <= askl) return 0;
  119.     if (l >= askl && r <= askr) return t1[v];
  120.     int m = (l + r) / 2;
  121.     return sum1(2 * v + 1, l, m, askl, askr) + sum1(2 * v + 2, m, r, askl, askr);
  122. }
  123.  
  124. int kth1(int v, int l, int r, int k) {
  125.     push1(v, l, r);
  126.     if (t1[v] < k) return n;
  127.     if (l + 1 == r) {
  128.         return l;
  129.     }
  130.     int m = (l + r) / 2;
  131.     if (real1(2 * v + 1, l, m) >= k) {
  132.         return kth1(2 * v + 1, l, m, k);
  133.     } else {
  134.         return kth1(2 * v + 2, m, r, k - real1(2 * v + 1, l, m));
  135.     }
  136. }
  137.  
  138. void setval1(int v, int l, int r, int askl, int askr, int val) {
  139.     push1(v, l, r);
  140.     if (l >= askr || r <= askl) return;
  141.     if (l >= askl && r <= askr) {
  142.         mod1[v] = val;
  143.         push1(v, l, r);
  144.         return;
  145.     }
  146.     int m = (l + r) / 2;
  147.     setval1(2 * v + 1, l, m, askl, askr, val);
  148.     setval1(2 * v + 2, m, r, askl, askr, val);
  149.     t1[v] = t1[2 * v + 1] + t1[2 * v + 2];
  150. }
  151.  
  152. struct node {
  153.     int sum = 0, mx = 0, mod = -1;
  154.     node() {}
  155.     node(int sum_, int mx_) {
  156.         sum = sum_, mx = mx_;
  157.     }
  158.     node(const node& a, const node& b) {
  159.         sum = a.sum + b.sum;
  160.         mx = max(a.mx, b.mx);
  161.     }
  162. };
  163.  
  164. node t2[8 * N];
  165.  
  166. void push2(int v, int l, int r) {
  167.     if (t2[v].mod != -1) {
  168.         t2[v].sum = t2[v].mod * (r - l);
  169.         t2[v].mx = t2[v].mod;
  170.         t2[2 * v + 1].mod = t2[2 * v + 2].mod = t2[v].mod;
  171.         t2[v].mod = -1;
  172.     }
  173. }
  174.  
  175. void setval2(int v, int l, int r, int askl, int askr, int val) {
  176.     push2(v, l, r);
  177.     if (l >= askr || r <= askl) return;
  178.     if (l >= askl && r <= askr) {
  179.         t2[v].mod = val;
  180.         push2(v, l, r);
  181.         return;
  182.     }
  183.     int m = (l + r) / 2;
  184.     setval2(2 * v + 1, l, m, askl, askr, val);
  185.     setval2(2 * v + 2, m, r, askl, askr, val);
  186.     t2[v] = node(t2[2 * v + 1], t2[2 * v + 2]);
  187. }
  188.  
  189. int real2mx(int v) {
  190.     if (t2[v].mod != -1) return t2[v].mod;
  191.     return t2[v].mx;
  192. }
  193.  
  194. int fmore2(int v, int l, int r, int x) {
  195.     push2(v, l, r);
  196.     if (t2[v].mx < x) return n;
  197.     if (l + 1 == r) {
  198.         return l;
  199.     }
  200.     int m = (l + r) / 2;
  201.     if (real2mx(2 * v + 1) >= x) {
  202.         return fmore2(2 * v + 1, l, m, x);
  203.     } else {
  204.         return fmore2(2 * v + 2, m, r, x);
  205.     }
  206. }
  207.  
  208. int sum2(int v, int l, int r, int askl, int askr) {
  209.     push2(v, l, r);
  210.     if (l >= askr || r <= askl) return 0;
  211.     if (l >= askl && r <= askr) return t2[v].sum;
  212.     int m = (l + r) / 2;
  213.     return sum2(2 * v + 1, l, m, askl, askr) + sum2(2 * v + 2, m, r, askl, askr);
  214. }
  215.  
  216. void D1(int v, int l, int r) {
  217.     push1(v, l, r);
  218.     if (l + 1 == r) {
  219.         cout << t1[v] << " ";
  220.         return;
  221.     }
  222.     int m = (l + r) / 2;
  223.     D1(2 * v + 1, l, m);
  224.     D1(2 * v + 2, m, r);
  225. }
  226.  
  227. void D2(int v, int l, int r) {
  228.     push2(v, l, r);
  229.     if (l + 1 == r) {
  230.         cout << t2[v].mx << " ";
  231.         return;
  232.     }
  233.     int m = (l + r) / 2;
  234.     D2(2 * v + 1, l, m);
  235.     D2(2 * v + 2, m, r);
  236. }
  237.  
  238. signed main() {
  239.     ios_base::sync_with_stdio(0);
  240.     cin.tie(0);
  241.     cout.tie(0);
  242.     #ifndef LOCAL
  243.         freopen("lamps.in", "r", stdin);
  244.         freopen("lamps.out", "w", stdout);
  245.     #endif
  246.     cin >> n >> q;
  247.     for (int i = 0; i < n; i++) {
  248.         char c;
  249.         cin >> c;
  250.         a[i] = c - '0';
  251.     }
  252.     int lst = n;
  253.     build1(0, 0, n);
  254.     // for (int i = 0; i < n; i++) {
  255.     //     cout << a[i];
  256.     // }
  257.     // cout << "\n";
  258.     for (int i = n - 1; i >= 0; i--) {
  259.         if (a[i] == 0) {
  260.             lst = i;
  261.         }
  262.         // dbg(i);
  263.         // dbg(lst);
  264.         setval2(0, 0, n, i, i + 1, lst);
  265.     }
  266.     push2(0, 0, n);
  267.     const int buben = n * (n - 1) / 2;
  268.     cout << t2[0].sum - buben << "\n";
  269.     // D1(0, 0, n);
  270.     // cout << "\n";
  271.     // D2(0, 0, n);
  272.     // cout << "\n";
  273.     while (q--) {
  274.         int l, r, c;
  275.         cin >> l >> r >> c;
  276.         l--, r--;
  277.         setval1(0, 0, n, l, r + 1, !c);
  278.         if (c == 1) {
  279.             int sum = sum1(0, 0, n, 0, r + 1);
  280.             // dbg(sum);
  281.             int pos = kth1(0, 0, n, sum + 1);
  282.             int sumpref = sum1(0, 0, n, 0, l);
  283.             int pospref;
  284.             if (sumpref == 0) {
  285.                 pospref = 0;
  286.             } else {
  287.                 pospref = kth1(0, 0, n, sumpref) + 1;
  288.             }
  289.             int rset = fmore2(0, 0, n, pos) - 1;
  290.             // dbg(pos);
  291.             chkmin(rset, pos);
  292.             if (pospref <= rset) {
  293.                 // dbg(pospref);
  294.                 // dbg(rset);
  295.                 setval2(0, 0, n, pospref, rset + 1, pos);
  296.             }
  297.         }
  298.         // D1(0, 0, n);
  299.         // cout << "\n";
  300.         // D2(0, 0, n);
  301.         // cout << "\n";
  302.         push2(0, 0, n);
  303.         cout << t2[0].sum - buben << "\n";
  304.     }
  305. }
  306. /*
  307. 7 4
  308. 1100101
  309. 4 6 1
  310. 3 6 0
  311. 3 4 1
  312. 5 7 1
  313. -> 5 13 13 19 28
  314.  
  315. 0 2 2 3
  316. 0 4 4 4
  317.  
  318. test 5
  319. 4 1
  320. 0100
  321. 3 4 1
  322. correct :
  323. 1
  324. 6
  325. wrong :
  326. 1
  327. 5
  328. */
  329.  
Advertisement
Add Comment
Please, Sign In to add comment