Advertisement
mrlantan

Untitled

Dec 20th, 2020
907
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <iterator>
  3. #include <memory>
  4. #include <vector>
  5. #include <random>
  6.  
  7. std::mt19937 generator(1991304);
  8. std::uniform_int_distribution dist(0, 2000000000);
  9.  
  10. template <typename ValueType>
  11. struct Node {
  12.     Node() = default;
  13.  
  14.     Node(Node* left, Node* right, Node* parent, const ValueType& value)
  15.         : left(left), right(right), parent(parent), value(value) {
  16.     }
  17.     Node* left = nullptr;
  18.     Node* right = nullptr;
  19.     Node* parent = nullptr;
  20.     int priority = dist(generator);
  21.     ValueType value = ValueType();
  22. };
  23.  
  24. template <typename ValueType>
  25. class Set;
  26.  
  27. template <typename ValueType>
  28. class SetIterator : public std::iterator<struct bidirectional_iterator_tag, ValueType, size_t,
  29.                                          ValueType*, ValueType&> {
  30. public:
  31.     friend class Set<ValueType>;
  32.     SetIterator() : node(nullptr) {
  33.     }
  34.  
  35.     explicit SetIterator(Node<ValueType>* node) : node(node) {
  36.     }
  37.  
  38.     SetIterator(const SetIterator&) = default;
  39.     SetIterator& operator=(const SetIterator&) = default;
  40.  
  41.     SetIterator& operator++() {
  42.         if (node->right) {
  43.             node = node->right;
  44.             while (node->left) {
  45.                 node = node->left;
  46.             }
  47.         } else {
  48.             while (node->parent->right == node) {
  49.                 node = node->parent;
  50.             }
  51.             node = node->parent;
  52.         }
  53.  
  54.         return *this;
  55.     }
  56.  
  57.     SetIterator& operator--() {
  58.         if (node->left) {
  59.             node = node->left;
  60.             while (node->right) {
  61.                 node = node->right;
  62.             }
  63.         } else {
  64.             while (node->parent->left == node) {
  65.                 node = node->parent;
  66.             }
  67.             node = node->parent;
  68.         }
  69.  
  70.         return *this;
  71.     }
  72.  
  73.     SetIterator operator++(int) {
  74.         SetIterator<ValueType> result(node);
  75.         ++*this;
  76.         return result;
  77.     }
  78.  
  79.     SetIterator operator--(int) {
  80.         SetIterator<ValueType> result(node);
  81.         --*this;
  82.         return result;
  83.     }
  84.  
  85.     bool operator==(SetIterator other) {
  86.         return node == other.node;
  87.     }
  88.  
  89.     bool operator!=(SetIterator other) {
  90.         return node != other.node;
  91.     }
  92.  
  93.     const ValueType& operator*() {
  94.         return node->value;
  95.     }
  96.  
  97.     const ValueType* operator->() {
  98.         return &(node->value);
  99.     }
  100.  
  101. private:
  102.     Node<ValueType>* node;
  103. };
  104.  
  105. template <typename ValueType>
  106. class Set {
  107. private:
  108.     void Split(Node<ValueType>* tree, const ValueType& value, Node<ValueType>*& left_tree,
  109.                Node<ValueType>*& right_tree) {
  110.         if (!tree)
  111.             left_tree = right_tree = nullptr;
  112.         else if (value < tree->value) {
  113.             Split(tree->left, value, left_tree, tree->left);
  114.             if (tree->left) {
  115.                 tree->left->parent = tree;
  116.             }
  117.             right_tree = tree;
  118.         } else {
  119.             Split(tree->right, value, tree->right, right_tree);
  120.             if (tree->right) {
  121.                 tree->right->parent = tree;
  122.             }
  123.             left_tree = tree;
  124.         }
  125.     }
  126.  
  127.     void Insert(Node<ValueType>*& cur_tree, Node<ValueType>* new_node) {
  128.         if (!cur_tree) {
  129.             cur_tree = new_node;
  130.             ++size_;
  131.         } else if (!(cur_tree->value < new_node->value) && !(new_node->value < cur_tree->value)) {
  132.             return;
  133.         } else if (cur_tree->priority < new_node->priority) {
  134.             auto parent = cur_tree->parent;
  135.             Split(cur_tree, new_node->value, new_node->left, new_node->right);
  136.             cur_tree = new_node;
  137.             ++size_;
  138.             if (new_node->left) {
  139.                 new_node->left->parent = new_node;
  140.             }
  141.             if (new_node->right) {
  142.                 new_node->right->parent = new_node;
  143.             }
  144.             new_node->parent = parent;
  145.         } else {
  146.             if (new_node->value < cur_tree->value) {
  147.                 if (!cur_tree->left) {
  148.                     new_node->parent = cur_tree;
  149.                 }
  150.                 Insert(cur_tree->left, new_node);
  151.             } else {
  152.                 if (!cur_tree->right) {
  153.                     new_node->parent = cur_tree;
  154.                 }
  155.                 Insert(cur_tree->right, new_node);
  156.             }
  157.         }
  158.     }
  159.  
  160.     void Merge(Node<ValueType>*& return_tree, Node<ValueType>* left_tree,
  161.                Node<ValueType>* right_tree) {
  162.         if (!left_tree || !right_tree) {
  163.             return_tree = left_tree ? left_tree : right_tree;
  164.         } else if (left_tree->priority > right_tree->priority) {
  165.             Merge(left_tree->right, left_tree->right, right_tree);
  166.             return_tree = left_tree;
  167.  
  168.             if (left_tree->left) {
  169.                 left_tree->left->parent = left_tree;
  170.             }
  171.  
  172.             if (left_tree->right) {
  173.                 left_tree->right->parent = left_tree;
  174.             }
  175.  
  176.         } else {
  177.             Merge(right_tree->left, left_tree, right_tree->left);
  178.             return_tree = right_tree;
  179.             if (right_tree->left) {
  180.                 right_tree->left->parent = right_tree;
  181.             }
  182.  
  183.             if (right_tree->right) {
  184.                 right_tree->right->parent = right_tree;
  185.             }
  186.         }
  187.     }
  188.  
  189.     void Erase(Node<ValueType>*& return_tree, const ValueType& value) {
  190.         if (!return_tree) {
  191.             return;
  192.         }
  193.         if (!(return_tree->value < value) && !(value < return_tree->value)) {
  194.             auto parent = return_tree->parent;
  195.             Merge(return_tree, return_tree->left, return_tree->right);
  196.             --size_;
  197.             if (return_tree) {
  198.                 return_tree->parent = parent;
  199.             }
  200.         } else {
  201.             Erase(value < return_tree->value ? return_tree->left : return_tree->right, value);
  202.         }
  203.     }
  204.  
  205.     Node<ValueType>* DeepCopy(Node<ValueType>* cur) {
  206.         auto new_cur = GetNewNode();
  207.         new_cur->value = cur->value;
  208.         new_cur->priority = cur->priority;
  209.  
  210.         if (!(new_cur->value < begin_->value) && !(begin_->value < new_cur->value)) {
  211.             begin_ = new_cur;
  212.         }
  213.  
  214.         if (cur->left) {
  215.             new_cur->left = DeepCopy(cur->left);
  216.             new_cur->left->parent = new_cur;
  217.         }
  218.  
  219.         if (cur->right) {
  220.             new_cur->right = DeepCopy(cur->right);
  221.             new_cur->right->parent = new_cur;
  222.         }
  223.  
  224.         return new_cur;
  225.     }
  226.  
  227.     SetIterator<ValueType> LowerBound(Node<ValueType>* node, const ValueType& value) const {
  228.         if (!(value < node->value) && !(node->value < value)) {
  229.             return SetIterator{node};
  230.         }
  231.  
  232.         auto child = node;
  233.  
  234.         bool is_left = true;
  235.  
  236.         if (value < node->value) {
  237.             is_left = true;
  238.             child = node->left;
  239.         } else {
  240.             is_left = false;
  241.             child = node->right;
  242.         }
  243.  
  244.         if (!child) {
  245.             if (is_left) {
  246.                 return SetIterator{node};
  247.             } else {
  248.                 auto iter = SetIterator<ValueType>(node);
  249.                 ++iter;
  250.                 return iter;
  251.             }
  252.         } else {
  253.             return LowerBound(child, value);
  254.         };
  255.     }
  256.  
  257.     Node<ValueType>* GetNewNode() {
  258.         if (pool_index == 20000) {
  259.             pool_counter++;
  260.             object_pools_[pool_counter].resize(20000);
  261.             pool_index = 0;
  262.         }
  263.  
  264.         return object_pools_[pool_counter].data() + pool_index++;
  265.     }
  266.  
  267.     Node<ValueType>* root_ = nullptr;
  268.     Node<ValueType>* end_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  269.     Node<ValueType>* begin_ = end_;
  270.     size_t size_ = 0;
  271.     size_t pool_counter = 0;
  272.     size_t pool_index = 0;
  273.     std::vector<std::vector<Node<ValueType>>> object_pools_ =
  274.         std::vector<std::vector<Node<ValueType>>>(100);
  275.  
  276. public:
  277.     typedef SetIterator<ValueType> iterator;
  278.  
  279.     Set() {
  280.         object_pools_[0].resize(20000);
  281.     }
  282.  
  283.     template <typename ForwardIT>
  284.     Set(ForwardIT begin, ForwardIT end) {
  285.         object_pools_[0].resize(20000);
  286.         for (auto it = begin; it != end; ++it) {
  287.             insert(*it);
  288.         }
  289.     }
  290.  
  291.     explicit Set(std::initializer_list<ValueType> ilist) {
  292.         object_pools_[0].resize(20000);
  293.         for (const auto& elem : ilist) {
  294.             insert(elem);
  295.         }
  296.     }
  297.  
  298.     Set(const Set& other) {
  299.         object_pools_[0].resize(20000);
  300.         if (other.size_ == 0) {
  301.             return;
  302.         }
  303.  
  304.         begin_ = GetNewNode();
  305.         begin_->value = other.begin_->value;
  306.         root_ = DeepCopy(other.root_);
  307.  
  308.         end_->left = root_;
  309.         root_->parent = end_;
  310.  
  311.         size_ = other.size_;
  312.     }
  313.  
  314.     Set& operator=(const Set& other) {
  315.         if (this == &other) {
  316.             return *this;
  317.         }
  318.  
  319.         if (other.size_ == 0) {
  320.             size_ = 0;
  321.             root_ = nullptr;
  322.             begin_ = end_;
  323.             end_->left = root_;
  324.  
  325.             return *this;
  326.         }
  327.  
  328.         begin_ = GetNewNode();
  329.         begin_->value = other.begin_->value;
  330.         root_ = DeepCopy(other.root_);
  331.  
  332.         end_->left = root_;
  333.         root_->parent = end_;
  334.  
  335.         size_ = other.size_;
  336.         return *this;
  337.     }
  338.  
  339.     ~Set() {
  340.         if (end_) {
  341.             delete end_;
  342.         }
  343.     }
  344.  
  345.     size_t size() const {
  346.         return size_;
  347.     }
  348.  
  349.     bool empty() const {
  350.         return size_ == 0;
  351.     }
  352.  
  353.     void insert(const ValueType& value) {
  354.         Node<ValueType>* new_node = GetNewNode();
  355.         new_node->value = value;
  356.  
  357.         Insert(root_, new_node);
  358.  
  359.         end_->left = root_;
  360.         root_->parent = end_;
  361.  
  362.         if (begin_ == end_) {
  363.             begin_ = new_node;
  364.         }
  365.  
  366.         if (new_node->value < begin_->value) {
  367.             begin_ = new_node;
  368.         }
  369.     }
  370.  
  371.     void erase(const ValueType& value) {
  372.         if (size_ == 0) {
  373.             return;
  374.         }
  375.  
  376.         if (!(begin_->value < value) && (value < begin_->value)) {
  377.             auto iter = SetIterator{begin_};
  378.             ++iter;
  379.             begin_ = iter.node;
  380.         }
  381.  
  382.         Erase(root_, value);
  383.     }
  384.  
  385.     SetIterator<ValueType> find(const ValueType& value) const {
  386.         if (size_ == 0) {
  387.             return SetIterator{end_};
  388.         }
  389.  
  390.         Node<ValueType>* cur_node = root_;
  391.  
  392.         while (cur_node) {
  393.             if (!(cur_node->value < value) && !(value < cur_node->value)) {
  394.                 return SetIterator{cur_node};
  395.             }
  396.  
  397.             Node<ValueType>* child = nullptr;
  398.             if (cur_node->value < value) {
  399.                 child = cur_node->right;
  400.             } else {
  401.                 child = cur_node->left;
  402.             }
  403.  
  404.             if (child) {
  405.                 cur_node = child;
  406.             } else {
  407.                 return SetIterator{end_};
  408.             }
  409.         }
  410.  
  411.         return SetIterator{end_};
  412.     }
  413.  
  414.     SetIterator<ValueType> lower_bound(const ValueType& value) const {
  415.         if (size_ == 0) {
  416.             return SetIterator{end_};
  417.         }
  418.  
  419.         return LowerBound(root_, value);
  420.     }
  421.  
  422.     SetIterator<ValueType> begin() const {
  423.         return SetIterator{begin_};
  424.     }
  425.  
  426.     SetIterator<ValueType> end() const {
  427.         return SetIterator{end_};
  428.     }
  429. };
  430.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement