zhukov000

stress_example

Nov 5th, 2021
1,041
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.91 KB | None | 0 0
  1. # include <bits/stdc++.h>
  2. //#pragma GCC optimize("Ofast")
  3. //#pragma GCC optimize("O3")
  4. //#pragma GNU optimize("O3")
  5. //#pragma G++ optimize("O3")
  6. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  7. //#pragma G++ optimize("no-stack-protection")
  8. #define int long long
  9. # define sz(x) ((int)(x).size())
  10. # define INF (long long)1e9+1
  11. # define mp(a, b) make_pair(a, b)
  12. # define all(x) x.begin(), x.end()
  13. using namespace std;
  14. typedef pair<int, int> pii;
  15. template<class T> void print(T v) {for (auto &x : v) cout << x << ' '; cout << '\n'; };
  16. template<class T> void print_1(T v) {for (auto &x : v) cout << x + 1 << ' '; cout << '\n'; };
  17.  
  18. /*==input-define==*/
  19.  
  20. #define input(v, sz) for(int i = 0; i < sz; ++i) {int x; cin >> x; v.emplace_back(x);}
  21.  
  22. /*==templates-for-pairs==*/
  23. #define fi first
  24. #define se second
  25. template<class T1, class T2> ostream& operator << (ostream &o, pair<T1, T2> x) {return o << x.fi << ' ' << x.se;}
  26. template<class T1, class T2> istream& operator >> (istream &o, pair<T1, T2> &x) {return o >> x.fi >> x.se;}
  27. template<class T1, class T2> pair<T1, T2> operator + (pair<T1, T2> a, pair<T1, T2> b) {a.fi += b.fi; a.se += b.se; return a;}
  28. template<class T1, class T2> pair<T1, T2> operator - (pair<T1, T2> a, pair<T1, T2> b) {a.fi -= b.fi; a.se -= b.se; return a;}
  29. template<class T1, class T2> void operator += (pair<T1, T2> &a, pair<T1, T2> b) {a.fi += b.fi; a.se += b.se;}
  30. template<class T1, class T2> void operator -= (pair<T1, T2> &a, pair<T1, T2> b) {a.fi -= b.fi; a.se -= b.se;}
  31.  
  32. void fastio()
  33. {
  34.     ios_base::sync_with_stdio(false);
  35.     cin.tie(nullptr);
  36.     cout.tie(nullptr);
  37. }
  38.  
  39. std::mt19937 my_gen(std::chrono::high_resolution_clock::now().time_since_epoch().count() ^ (size_t)(new char));
  40.  
  41. int gen_int(int a, int b) {
  42.     assert(a <= b && "Wrong using random generator!");
  43.     return my_gen() % (b - a + 1) + a;
  44. }
  45.  
  46. /*
  47. @author: Shvandre
  48. ████████████████████████████████████████
  49. ████████████▓▒▒▒░░░░░░░░▒▒▒▓████████████
  50. ███████░────────────────────────▒███████
  51. ████▒──────────────────────────────▒████
  52. ███▒─────────────────────────────────███
  53. ███──────────────────────────────────▓██
  54. ██░───────────────────────────────────██
  55. ██───░███████▒────────────▒███████░───██
  56. ██──▓█▓░████████░──────░████████░▓█▓──██
  57. █▓─░░─────░▓█████▒────▓█████▓░─────░──▓█
  58. █▒───────────▓██▓─────░▒██▓───────────▓█
  59. █░─────────────██──────██─────────────▒█
  60. █░───▒███████▒──██────░▓──▒███████▒───░█
  61. █░─▒███████████─██──────░███████████▒░░█
  62. █░─████▓▓▓▓▓▓▒░─██░──────▒▒░░░░░▒░░░░─▒█
  63. █░──────────────██░───────────────────░█
  64. ██─────────────░██░───────────────────░█
  65. ███────────────▓██────────────────────██
  66. ██▓█──────────▒███─────░▒───────────░███
  67. ██─████▒▒▓▒░░█████─────▒██──▒▓▒░░▒▒█▒███
  68. ███─█▓██────▒█▒─██───────▓░─░▒░▒████─███
  69. ███▒─█▒██───────█▓─────────────██─█─▒███
  70. ████░─█▓███▓░───██▒▒▒▓█░────░███─█▒─████
  71. █████──█▓▒█████████▓███████████░█▓─█████
  72. ██████──██──▒█████░──███████▒──█▓─██████
  73. ███████──██▓──────░░░░░░──────█▒─███████
  74. ████████──██▓░▒▒░░───────────█▒─████████
  75. █████████──█▒──░░▒████▒────░█░─█████████
  76. ██████████─░█─────███▒─────▒░─██████████
  77. ███████████░─────▒████───────███████████
  78. █████████████────█████─────░████████████
  79. ██████████████───▓████────▓█████████████
  80. ███████████████───███░──░███████████████
  81. █████████████████▒███▒▒█████████████████
  82. ████████████████████████████████████████
  83. ████████████████████████████████████████
  84. ██████──█──██────██─██─██───██────██████
  85. ███████───███─██─██─█─███─████─██─██████
  86. ████████─████────██──████───██────██████
  87. ███████───███─██─██─█─███─████─█████████
  88. ██████──█──██─██─██─██─██───██─█████████
  89. ████████████████████████████████████████
  90.  */
  91.  
  92. vector<int> a;
  93. int n, m;
  94.  
  95. struct Command {
  96.     char t;
  97.     int p[3];
  98. };
  99.  
  100. vector<Command> cmd;
  101.  
  102. struct NODE
  103. {
  104.     int zeros_cnt = 0;
  105.     NODE(int _value)
  106.     {
  107.         zeros_cnt = _value;
  108.     }
  109. };
  110. struct seg_tree
  111. {
  112.     vector<NODE> tree;
  113.     seg_tree(int n)
  114.     {
  115.         tree.assign(4*n, NODE(0));
  116.     }
  117.     NODE combine(NODE v1, NODE v2)
  118.     {
  119.         return NODE(v1.zeros_cnt + v2.zeros_cnt);
  120.     }
  121.     void build(int x, int lx, int rx)
  122.     {
  123.         if(rx - lx == 1)
  124.         {
  125.             if(a[lx] == 0)
  126.                 tree[x] = NODE(1);
  127.             else
  128.                 tree[x] = NODE(0);
  129.             return;
  130.         }
  131.         int m = (lx+rx) / 2;
  132.         build(x*2+1, lx, m);
  133.         build(x*2+2, m, rx);
  134.         tree[x] = combine(tree[x*2+1], tree[x*2+2]);
  135.     }
  136.     void set(int i, int value, int x, int lx, int rx)
  137.     {
  138.         if(rx - lx == 1)
  139.         {
  140.             if(value == 0)
  141.                 tree[x] = NODE(1);
  142.             else
  143.                 tree[x] = NODE(0);
  144.             return;
  145.         }
  146.         int m = (lx+rx) / 2;
  147.         if(i < m)
  148.         {
  149.             set(i, value, x*2+1, lx, m);
  150.         }
  151.         else
  152.         {
  153.             set(i, value, x*2+2, m, rx);
  154.         }
  155.         tree[x] = combine(tree[x*2+1], tree[x*2+2]);
  156.     }
  157.     int ask(int k, int R, int x, int lx, int rx)
  158.     {
  159.         if(rx - lx == 1)
  160.         {
  161.             if(lx >= R) return -2; //TODO
  162.             return lx;
  163.         }
  164.         int m = (lx + rx) / 2;
  165.         if (tree[x*2+1].zeros_cnt + tree[x*2+2].zeros_cnt < k)
  166.         {
  167.             return -2;
  168.         }
  169.         else if(tree[x*2+1].zeros_cnt < k)
  170.         {
  171.             return ask(k - tree[x*2+1].zeros_cnt, R,  x*2+2, m, rx);
  172.         }
  173.         else
  174.         {
  175.             return ask(k, R, x*2 + 1, lx, m);
  176.         }
  177.     }
  178.     NODE zero_count_until_Segment(int l, int r, int LX, int RX, int idx)
  179.     {
  180.         if(l >= RX || r <= LX) return 0;
  181.         if(l <= LX && RX <= r) return tree[idx];
  182.         int m = (RX + LX) / 2;
  183.         return combine(zero_count_until_Segment(l, r, LX, m, idx*2+1), zero_count_until_Segment(l, r, m, RX, idx*2+2));
  184.     }
  185. };
  186.  
  187. vector<int> solve() {
  188.     vector<int> r;
  189.     seg_tree my_tree(n);
  190.     my_tree.build(0, 0, n);
  191.     for(int i = 0; i < m; ++i)
  192.     {
  193.         if(cmd[i].t == 'u')
  194.         {
  195.             int idx = cmd[i].p[0], value = cmd[i].p[1];
  196.             my_tree.set(idx - 1, value, 0, 0, n);
  197.         }
  198.         else {
  199.             int L = cmd[i].p[0], R = cmd[i].p[1], k = cmd[i].p[2];
  200.             int zero_cnt = my_tree.zero_count_until_Segment(0, L - 1, 0, n, 0).zeros_cnt;
  201.             r.push_back(my_tree.ask(zero_cnt + k, R, 0, 0, n) + 1);
  202.         }
  203.     }
  204.     return r;
  205. }
  206.  
  207. vector<int> slow() {
  208.     vector<int> r;
  209.     vector<int> b = a;
  210.     for(int i = 0; i < m; ++i)
  211.     {
  212.         if(cmd[i].t == 'u')
  213.         {
  214.             int idx = cmd[i].p[0], value = cmd[i].p[1];
  215.             b[idx-1] = value;
  216.         }
  217.         else {
  218.             int L = cmd[i].p[0], R = cmd[i].p[1], k = cmd[i].p[2];
  219.             int ans = -1, t = 0;
  220.  
  221.             for(int j = L-1; j < R; ++j) {
  222.                 if (b[j] == 0) {
  223.                     ++t;
  224.                 }
  225.                 if (t == k) {
  226.                     ans = j + 1;
  227.                     break;
  228.                 }
  229.             }
  230.  
  231.             r.push_back(ans);
  232.         }
  233.     }
  234.     return r;
  235. }
  236.  
  237. void read_data() {
  238.     fastio();
  239.     cin >> n;
  240.     input(a, n)
  241.     cin >> m;
  242.     cmd.resize(m);
  243.     for(int i = 0; i < m; ++i)
  244.     {
  245.         cin >> cmd[i].t;
  246.         if(cmd[i].t == 'u')
  247.         {
  248.             cin >> cmd[i].p[0] >> cmd[i].p[1];
  249.         } else {
  250.             cin >> cmd[i].p[0] >> cmd[i].p[1] >> cmd[i].p[2];
  251.         }
  252.     }
  253. }
  254.  
  255. void print_data() {
  256.     cout << n << '\n';
  257.     for(auto x: a) {
  258.         cout << x << ' ';
  259.     }
  260.     cout << '\n' << m << '\n';
  261.     for(auto c: cmd) {
  262.         if (c.t == 'u') {
  263.             cout << c.t << ' ' << c.p[0] << ' ' << c.p[1] << '\n';
  264.         } else {
  265.             cout << c.t << ' ' << c.p[0] << ' ' << c.p[1] << ' ' << c.p[2] << '\n';
  266.         }
  267.     }
  268. }
  269.  
  270. void gen_data() {
  271.     const int MAXN = 20,  MAXM = 10, MAXV = 100;
  272.  
  273.     n = gen_int(1, MAXN);
  274.     a.resize(n);
  275.     for(size_t i=0; i<n; ++i) {
  276.         a[i] = gen_int(0, MAXV);
  277.     }
  278.     m = gen_int(1, MAXM);
  279.     cmd.resize(m);
  280.     for(size_t i=0; i<m; ++i) {
  281.         int t = gen_int(0, 1);
  282.  
  283.         if (t == 0) {
  284.             cmd[i].t = 'u';
  285.             cmd[i].p[0] = gen_int(1, n);
  286.             cmd[i].p[1] = gen_int(0, MAXV);
  287.         } else {
  288.             cmd[i].t = 's';
  289.             cmd[i].p[0] = gen_int(1, n);
  290.             cmd[i].p[1] = gen_int(cmd[i].p[0], n);
  291.             cmd[i].p[2] = gen_int(1, n);
  292.         }
  293.     }
  294. }
  295.  
  296. int32_t main()
  297. {
  298.     read_data();
  299.  
  300.     /**
  301.     for (auto x: solve() ) {
  302.         cout << x << '\n';
  303.     }
  304.     return 0;
  305.     */
  306.  
  307.     while(true) {
  308.         gen_data();
  309.         if (slow() != solve()) {
  310.             print_data();
  311.             break;
  312.         }
  313.     }
  314.     return 0;
  315. }
Advertisement
Add Comment
Please, Sign In to add comment