Egor_Bugaev

death

Feb 5th, 2022 (edited)
1,362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.72 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <stdio.h>
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define pll pair<ll, ll>
  7. #define vll vector<ll>
  8. #define pii pair<int, int>
  9. #define vpll vector<pll >
  10. #define vpii vector<pii >
  11. #define vii vector<int>
  12. #define f first
  13. #define s second
  14. #define mp make_pair
  15. #define pb push_back
  16. #define ld long double
  17.  
  18. #define endl '\n'
  19. #define inf (ll)((ll)7e18)
  20. #define eps (ld)(1e-12)
  21.  
  22. #define MOD (ll)((ll)1e9 + 7)
  23. #define MOD2 (ll)((ll)1e9 + 17)
  24.  
  25. ostream& operator<<(ostream& os, vii& x)
  26. {
  27.     for(int t : x)
  28.         os << t << " ";
  29.     return os;
  30. }
  31.  
  32. ostream& operator<<(ostream& os, pii& x)
  33. {
  34.     os << x.f << " " << x.s << " ";
  35.     return os;
  36. }
  37.  
  38. istream& operator>>(istream& is, pii& x)
  39. {
  40.     is >> x.f >> x.s;
  41.     return is;
  42. }
  43.  
  44. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  45. std::uniform_int_distribution<int> distrib(1,100000000);
  46.  
  47. vll p = {1, 239};
  48. vll p2 = {1, 396247};
  49. int globalCnt = 0;
  50. int globalCnt2 = 0;
  51. struct DescartesTree {
  52.  
  53.     DescartesTree() {
  54.         root = nullptr;
  55.     }
  56.  
  57.     struct Node {
  58.  
  59.         Node* left, *right;
  60.         int key, y, md, size;
  61.         int size2;
  62.  
  63.         Node(int key_) {
  64.             left = nullptr;
  65.             right = nullptr;
  66.             size = 1;
  67.             size2 = 1;
  68.             y = rand(); //distrib(rng);
  69.             key = key_;
  70.             md = 0;
  71.         }
  72.     private:
  73.  
  74.     };
  75.  
  76.     Node* root;
  77.  
  78.     void update(Node* node) {
  79.         if (node == nullptr) {
  80.             return;
  81.         }
  82.         update2(node->left);
  83.         update2(node->right);
  84.         int size2 = 1;
  85.         if (node->left != nullptr) {
  86.             size2 += node->left->size2;
  87.         }
  88.         if (node->right != nullptr) {
  89.             size2 += node->right->size2;
  90.         }
  91.         node->size2 = size2;
  92.  
  93.         int size = 1;
  94.         if (node->left != nullptr) {
  95.             size += node->left->size;
  96.         }
  97.         if (node->right != nullptr) {
  98.             size += node->right->size;
  99.         }
  100.         node->size = size;
  101.  
  102.         if (size != size2) {
  103.             assert(0);
  104.         }
  105.  
  106.         if (node->left != nullptr) {
  107.             node->left->md += node->md;
  108.         }
  109.         if (node->right != nullptr) {
  110.             node->right ->md += node->md;
  111.         }
  112.         node->key += node->md;
  113.         node->md = 0;
  114.     }
  115.  
  116.     void update2(Node* node) {
  117.         if (node == nullptr) {
  118.             return;
  119.         }
  120.         update2(node->left);
  121.         update2(node->right);
  122.         int size = 1;
  123.         if (node->left != nullptr) {
  124.             size += node->left->size2;
  125.         }
  126.         if (node->right != nullptr) {
  127.             size += node->right->size2;
  128.         }
  129.         node->size2 = size;
  130.     }
  131.  
  132.  
  133.  
  134.     pair<Node*, Node*> split(int key, Node* node) {
  135.        // cerr << "inside split" << endl;
  136.         if (node == nullptr) {
  137.             return {nullptr, nullptr};
  138.         }
  139.  
  140.         update(node);
  141.         if (node->key >= key) {
  142.             pair<Node*, Node*> t = split(key, node->left);
  143.             node->left = t.second;
  144.             update(node);
  145.             return {t.first, node};
  146.         }  else {
  147.             pair<Node*, Node*> t = split(key, node->right);
  148.             node->right = t.first;
  149.             update(node);
  150.             return {node, t.second};
  151.         }
  152.     }
  153.  
  154.     Node* merge(Node* left, Node* right) {
  155.        // cerr << "inside merge" << endl;
  156.         update(left);
  157.         update(right);
  158.  
  159.         if (left == nullptr) {
  160.             return right;
  161.         }
  162.         if (right == nullptr) {
  163.             return left;
  164.         }
  165.  
  166.         if (left->y < right->y) {
  167.             left->right = merge(left->right, right);
  168.             update(left);
  169.             return left;
  170.         } else {
  171.             right->left = merge(left, right->left);
  172.             update(right);
  173.             return right;
  174.         }
  175.     }
  176.  
  177.     void insert(int key) {
  178.        // cerr << "in insert" << endl;
  179.         update(root);
  180.         pair<Node*, Node*> sp1 = split(key, root);
  181.         Node* newNode = new Node(key);
  182.         sp1.f = merge(sp1.f, newNode);
  183.         update(sp1.f);
  184.         root = merge(sp1.f, sp1.s);
  185.         update(root);
  186.     }
  187.  
  188.     void erase(int key) {
  189.       //  cerr << "in erase" << endl;
  190.         pair<Node*, Node*> sp1 = split(key, root);
  191.         Node* cur = sp1.s;
  192.         Node* prev = nullptr;
  193.  
  194.         vector<Node*> way;
  195.         while (cur != nullptr && cur->left != nullptr) {
  196.             way.pb(cur);
  197.             update(cur);
  198.             prev = cur;
  199.             cur = cur->left;
  200.         }
  201.         update(cur);
  202.  
  203.         if (cur == nullptr || cur->key != key) {
  204.             root = merge(sp1.f, sp1.s);
  205.             return;
  206.         }
  207.  
  208.         if (prev == nullptr) {
  209.             prev = cur->right;
  210.             update(prev);
  211.             sp1.s = prev;
  212.         } else {
  213.             update(prev);
  214.             prev->left = cur->right;
  215.             update(prev->left);
  216.             update(prev);
  217.         }
  218.         reverse(way.begin(), way.end());
  219.         for (int i = 1; i < way.size(); ++i) {
  220.             update(way[i]);
  221.         }
  222.  
  223.         root = merge(sp1.f, sp1.s);
  224.     }
  225.  
  226.     void addToSuff(Node* node, int x, int suffSize) {
  227.        // cerr << "in addToSuff" << endl;
  228.         update(node);
  229.         if (suffSize <= 0 || node == nullptr) {
  230.             return;
  231.         }
  232.         update(node->left); update(node->right); update(node);
  233.       //  cerr << "x " << x << " for node " << node->key << " node->size" << node->size << " suffSize " << suffSize << endl;
  234.    //     cerr << "children " << (node->left == nullptr ? 0 : node->left->size) << " right " << (node->right == nullptr ? 0 : node->right->size) << endl;
  235.         if (globalCnt == 80) {
  236.             if (x == 1) {
  237.                 cerr << "x " << x << " for node " << node->key << " node->size" << node->size << " suffSize " << suffSize << endl;
  238.             }
  239.         }
  240.  
  241.         if (node->size <= suffSize) {
  242.             if (node->size < suffSize) {
  243.                 assert(0);
  244.             }
  245.             node->md += x;
  246.             update(node);
  247.             update(node->left); update(node->right);
  248.             return;
  249.         }
  250.  
  251.         if (node->right != nullptr) {
  252.             update(node->right);
  253.             addToSuff(node->right, x, min(suffSize, node->right->size));
  254.             update(node);
  255.  
  256.             suffSize -= min(suffSize, node->right->size);
  257.         }
  258.         if (suffSize > 0) {
  259.             update(node);
  260.             node->key += x;
  261.             update(node);
  262.  
  263.             update(node->left);
  264.             addToSuff(node->left, x, suffSize - 1);
  265.             update(node);
  266.         }
  267.     }
  268.  
  269.     int am(int key) {
  270.       //   cerr << "in am" << endl;
  271.         update(root);
  272.         pair<Node*, Node*> sp1 = split(key, root);
  273.         pair<Node*, Node*> sp2 = split(key + 1, sp1.s);
  274.         if (sp2.f == nullptr) {
  275.             root = merge(sp2.f, sp2.s);
  276.             update(root);
  277.             root = merge(sp1.f, root);
  278.             update(root);
  279.             return 0;
  280.         }
  281.  
  282.         update(sp2.f);
  283.         int t = sp2.f->size;
  284.         root = merge(sp2.f, sp2.s);
  285.         update(root);
  286.         root = merge(sp1.f, root);
  287.         update(root);
  288.         return t;
  289.     }
  290.  
  291.     vii all_nodes;
  292.     void cout_all_vals(Node* node) {
  293.         update(node);
  294.  
  295.         if (node == nullptr) {
  296.             return;
  297.         }
  298.         if (node->key < 0) {
  299.             assert(0);
  300.         }
  301.  
  302.         cout_all_vals(node->left);
  303.         all_nodes.pb(node->key);
  304.         cout_all_vals(node->right);
  305.     }
  306. };
  307.  
  308. void cout_all_good_nodes(vii& x) {
  309.     for (auto el : x) {
  310.         if (el != 0){
  311.             cout << el << " ";
  312.         }
  313.     }
  314. }
  315. bool debugOut = 0;
  316.  
  317. vii my_solve(int n, int m, vii a, vector<pair<char, int> > query) {
  318.     DescartesTree tree1, tree2;
  319.  
  320.  
  321.     int mx = 1000; //400005;
  322.     for (int i = 0; i < mx; ++i) {
  323.         tree1.insert(0);
  324.         tree2.insert(0);
  325.     }
  326.  
  327.     for (int i = 0; i < n; ++i) {
  328.         int x = a[i];
  329.  
  330.         tree1.insert(x);
  331.         tree2.addToSuff(tree2.root, 1, x);
  332.     }
  333.  
  334.     for (int s = 0; s < m; ++s) {
  335.         globalCnt2 = s;
  336.         if (debugOut) {
  337.             cout << "s " << s << endl;
  338.             cout << "cerr_all_valls tree1 ";
  339.             tree1.cout_all_vals(tree1.root); cout_all_good_nodes(tree1.all_nodes); cout << " end" << endl;
  340.             cout << "cerr_all_valls tree2 ";
  341.             tree2.cout_all_vals(tree2.root); cout_all_good_nodes(tree2.all_nodes); cout << " end" << endl;
  342.             tree1.all_nodes.clear();
  343.             tree2.all_nodes.clear();
  344.         }
  345.         char q;
  346.         q = query[s].f;
  347.         //cin >> q;
  348.         if (q == 't') {
  349.             swap(tree1, tree2);
  350.         } else if (q == 'a') {
  351.             int x;
  352.             x = query[s].s;
  353.             tree1.insert(x);
  354.             tree2.addToSuff(tree2.root, 1, x);
  355.         } else if (q == 'r') {
  356.             int x;
  357.             x = query[s].s;
  358.  
  359.             if (tree1.am(x) >= 1) {
  360.                 tree1.erase(x);
  361.                 tree2.addToSuff(tree2.root, -1, x);
  362.             }
  363.  
  364.         } else {
  365.             int x;
  366.             x = query[s].s;
  367.             cout << tree1.am(x) << endl;
  368.         }
  369.     }
  370.  
  371.     tree1.all_nodes = {};
  372.     tree1.cout_all_vals(tree1.root);
  373.     sort(tree1.all_nodes.begin(), tree1.all_nodes.end());
  374.  
  375.     vii res;
  376.     bool wasNonZero = 0;
  377.     for (auto el : tree1.all_nodes) {
  378.         if (el != 0) {
  379.             wasNonZero = 1;
  380.             res.pb(el);
  381.         } else if (wasNonZero) {
  382.             assert(0);
  383.         }
  384.     }
  385.     return res;
  386. }
  387.  
  388. multiset<int> change(multiset<int> st) {
  389.     vii sorted;
  390.     while (st.size() > 0) {
  391.         sorted.pb(*st.begin());
  392.         st.erase(st.begin());
  393.     }
  394.     //   cerr << "lal" << endl;
  395.     multiset<int> answ;
  396.     for (int i = 1; i <= (sorted.size() == 0 ? 0 : sorted.back()); ++i) {
  397.         int cnt = 0;
  398.         //         cerr << "cnt " << cnt  << endl;
  399.         for (auto el : sorted) {
  400.             if (el >= i) {
  401.                 ++cnt;
  402.             }
  403.         }
  404.         answ.insert(cnt);
  405.     }
  406.     return answ;
  407. }
  408.  
  409. vii getArr(multiset<int> st) {
  410.     vii res;
  411.     while (st.size() > 0) {
  412.         res.pb(*st.begin());
  413.         st.erase(st.begin());
  414.     }
  415.     return res;
  416. }
  417.  
  418. int main() {
  419.     ios_base::sync_with_stdio(0);
  420.     cin.tie(0);
  421.     cout.tie(0);
  422.  
  423.     // freopen("movetofront.in", "r", stdin);
  424.     // freopen("movetofront.out", "w", stdout);
  425. #ifdef LOCAL
  426.     freopen("Input.txt", "r", stdin);
  427.     freopen("Output.txt", "w", stdout);
  428. #endif
  429.    srand(4);
  430.  
  431.    bool mode = 1;
  432.    if (mode == 0) {
  433.        int n, m;
  434.        cin >> n >> m;
  435.        vii x(n);
  436.        for (int i = 0; i < n; ++i) {
  437.            cin >> x[i];
  438.        }
  439.        vector<pair<char, int> > query;
  440.        for (int i = 0; i < m; ++i) {
  441.            char type;
  442.            cin >> type;
  443.            if (type == 't') {
  444.                query.pb({type, 0});
  445.            } else {
  446.                int x;
  447.                cin >> x;
  448.                query.pb({type, x});
  449.            }
  450.        }
  451.  
  452.        vii j = my_solve(n, m, x, query);
  453.        for (auto el : j) {
  454.            cout << el << " ";
  455.        }
  456.        return 0;
  457.    }
  458.     if (mode == 1) {
  459.         int n, m;
  460.         n = 8, m = 7;
  461.         vii x = {6, 4, 10, 2, 8, 6, 7, 1};
  462.         vector<pair<char, int> > query;
  463.         query = {{'r', 7}, {'t', 0}, {'a', 8}, {'t', 0}, {'t', 0}, {'r', 5}, {'t', 0}, {'r', 3}};
  464.  
  465.         debugOut = 1;
  466.         vii j = my_solve(n, m, x, query);
  467.         //debugOut = 0;
  468.         for (int i = 0; i < 100; ++i) {
  469.             globalCnt = i;
  470.             vii t = my_solve(n, m, x, query);
  471.             if (t != j) {
  472.                 cerr << "i " <<i  << endl;
  473.                 cerr << "ub detected" << endl;
  474.                 cerr << 't' << t << endl;
  475.                 cerr << 'j' << j << endl;
  476.                 return 0;
  477.             }
  478.         }
  479.         return 0;
  480.     }
  481.    for (int test = 0; test < 1000; ++test) {
  482.        cerr << "test " << test << endl;
  483.        int n = distrib(rng) % 10 + 1;
  484.        int m = distrib(rng) % 10 + 1;
  485.  
  486.        vii x;
  487.        multiset<int> st;
  488.        for (int i = 0; i < n; ++i) {
  489.            x.pb(distrib(rng) % 10 + 1);
  490.            st.insert(x.back());
  491.        }
  492.  
  493.        cerr << "here" << endl;
  494.        vector<pair<char, int> > query;
  495.        for (int i = 0; i < m; ++i) {
  496.            int type = distrib(rng) % 4;
  497.            if (type == 0) {
  498.                int x = distrib(rng) % 10 + 1;
  499.                query.push_back({'a', x});
  500.                st.insert(x);
  501.            } else if (type == 1) {
  502.                int x = distrib(rng) % 10 + 1;
  503.                query.push_back({'r', x});
  504.                if (st.find(x) != st.end())
  505.                    st.erase(st.find(x));
  506.            } else if (type >= 2) {
  507.                query.push_back({'t', 0});
  508.                st = change(st);
  509.            }
  510.  
  511.            if (getArr(st) != my_solve(n, query.size(), x, query)) {
  512.                cout << "failed operation " << type << endl;
  513.                return 0;
  514.            }
  515.        }
  516.  
  517.        vii answ = getArr(st);
  518.        reverse(answ.begin(), answ.end());
  519.        vii my_answ = my_solve(n, m, x, query);
  520.        reverse(answ.begin(), answ.end());
  521.        if (my_answ != answ) {
  522.            cout << "wrong" << endl;
  523.            cout << "myAnsw " << my_answ << endl;
  524.            cout << "theirAnsw " << answ << endl;
  525.            cout << n << " " << m << endl;
  526.            cout << x << endl;
  527.            for (auto el : query) {
  528.                if (el.f != 't') {
  529.                    cout << el.f << " " << el.s << endl;
  530.                } else {
  531.                    cout << el.f << " " << endl;
  532.                }
  533.  
  534.            }
  535.            cout << endl;
  536.            return 0;
  537.        }
  538.    }
  539.  
  540.    return 0;
  541. }
Advertisement
Add Comment
Please, Sign In to add comment