Advertisement
LegoSosiska

Haahhahaha

Apr 14th, 2022
932
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 39.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <SFML/Graphics.hpp>
  3. #include <SFML/Window.hpp>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <cmath>
  7. #include <vector>
  8.  
  9. struct Node {
  10.     Node* left = nullptr;
  11.     Node* right = nullptr;
  12.     Node* prev = nullptr;
  13.     int key = 0;
  14.     int priority = 0;
  15.     int color = 0;
  16.     int height = 1;
  17.     int size = 1;
  18. };
  19.  
  20. void Swap(Node*& a, Node*& b) {
  21.  
  22. }
  23.  
  24. int Size(Node* treap) {
  25.     return treap == nullptr ? 0 : treap->size;
  26. }
  27.  
  28. int Recalc(Node* treap) {
  29.     return Size(treap->left) + Size(treap->right) + 1;
  30. }
  31.  
  32. Node* Create(int key, int color = 0) {
  33.     Node* p = new Node;
  34.     p->key = key;
  35.     p->color = color;
  36.     p->priority = std::rand() % 1000000000;
  37.     return p;
  38. }
  39.  
  40. bool CheckColor(Node* p) {
  41.     if (p == nullptr) return true;
  42.     if (p->color == 0) return true;
  43.     if (p->color == 1) return false;
  44. }
  45.  
  46. struct Avl {
  47.     Node* root = nullptr;
  48.  
  49.     Node* find(int key, Node* search) {
  50.         if (search == nullptr) {
  51.             return nullptr;
  52.         }
  53.         if (search->key == key) {
  54.             return search;
  55.         }
  56.         if (key > search->key) {
  57.             return find(key, search->right);
  58.         }
  59.         if (key < search->key) {
  60.             return find(key, search->left);
  61.         }
  62.     }
  63.  
  64.     void fixHeight(Node* p) {
  65.         if (p == nullptr) {
  66.             return;
  67.         }
  68.         int left = 0, right = 0;
  69.         if (p->left != nullptr) {
  70.             left = p->left->height;
  71.             p->left->prev = p;
  72.         }
  73.         if (p->right != nullptr) {
  74.             right = p->right->height;
  75.             p->right->prev = p;
  76.         }
  77.         p->height = std::max(left, right) + 1;
  78.     }
  79.  
  80.     int dif(Node* p) {
  81.         if (p == nullptr) {
  82.             return 0;
  83.         }
  84.         int left = 0, right = 0;
  85.         if (p->left != nullptr) {
  86.             left = p->left->height;
  87.         }
  88.         if (p->right != nullptr) {
  89.             right = p->right->height;
  90.         }
  91.         return right - left;
  92.     }
  93.  
  94.     void rotateSmall(Node*& p, bool direction) {
  95.         if (p == nullptr) {
  96.             return;
  97.         }
  98.         Node* q;
  99.         if (!direction) {
  100.             q = p->right;
  101.             p->right = q->left;
  102.             q->left = p;
  103.         }
  104.         else {
  105.             q = p->left;
  106.             p->left = q->right;
  107.             q->right = p;
  108.         }
  109.         fixHeight(q);
  110.         fixHeight(p);
  111.         p = q;
  112.     }
  113.  
  114.     void rotateBig(Node* p, bool direction) {
  115.         if (p == nullptr) {
  116.             return;
  117.         }
  118.         Node* q, * r;
  119.         if (!direction) {
  120.             q = p->right;
  121.             r = q->left;
  122.             r->left = p;
  123.             r->right = q;
  124.         }
  125.         else {
  126.             q = p->left;
  127.             r = q->right;
  128.             r->right = p;
  129.             r->left = q;
  130.         }
  131.         fixHeight(p);
  132.         fixHeight(q);
  133.         fixHeight(r);
  134.         p = r;
  135.     }
  136.  
  137.     void balance(Node*& p) {
  138.         if (p == nullptr) {
  139.             return;
  140.         }
  141.         fixHeight(p);
  142.         if (dif(p) == 2) {
  143.             if (dif(p->right) < 0) {
  144.                 if (p->left != nullptr) {
  145.                     rotateSmall(p, true);
  146.                 }
  147.             }
  148.             if (p->right != nullptr) {
  149.                 rotateSmall(p, false);
  150.             }
  151.         }
  152.         if (dif(p) == -2) {
  153.             if (dif(p->left) > 0) {
  154.                 if (p->right != nullptr) {
  155.                     rotateSmall(p, false);
  156.                 }
  157.             }
  158.             if (p->left != nullptr) {
  159.                 rotateSmall(p, true);
  160.             }
  161.         }
  162.         return;
  163.     }
  164.  
  165.     bool insert(int key, Node*& p) {
  166.         if (find(key, root) != nullptr) {
  167.             return false;
  168.         }
  169.         if (p == nullptr) {
  170.             p = Create(key);
  171.             if (root == nullptr) {
  172.                 root = p;
  173.             }
  174.             return true;
  175.         }
  176.         if (key < p->key) {
  177.             insert(key, p->left);
  178.         }
  179.         else {
  180.             insert(key, p->right);
  181.         }
  182.         balance(p);
  183.         return true;
  184.     }
  185.  
  186.     Node* findMin(Node* search) {
  187.         if (search == nullptr) {
  188.             return nullptr;
  189.         }
  190.         if (search->left == nullptr) {
  191.             return search;
  192.         }
  193.         return findMin(search->left);
  194.     }
  195.  
  196.     void removeMin(Node*& search) {
  197.         if (search == nullptr) {
  198.             return;
  199.         }
  200.         if (search->left == nullptr) {
  201.             Node* toDelete = search;
  202.             search = search->right;
  203.             delete toDelete;
  204.             return;
  205.         }
  206.         removeMin(search->left);
  207.         balance(search);
  208.     }
  209.  
  210.     bool remove(int key, Node*& p) {
  211.         /*if (p == nullptr) {
  212.             return false;
  213.         }
  214.         if (key < p->key) {
  215.             remove(key, p->left);
  216.         }
  217.         else if (key > p->key) {
  218.             remove(key, p->right);
  219.         }
  220.         else {
  221.             Node* left = p->left;
  222.             Node* right = p->right;
  223.             //Node* toDelete = p;
  224.            
  225.             p = findMin(right);
  226.             removeMin(right);
  227.             p->right = right;
  228.             p->left = left;
  229.             balance(p);
  230.             return true;
  231.         }
  232.         balance(p);
  233.         return true;
  234.         */
  235.         return true;
  236.     }
  237.    
  238. };
  239.  
  240. struct Treap {
  241.     Node* root = nullptr;
  242.     Node* cur = nullptr;
  243.     Node* splitLeft = nullptr, * splitRight = nullptr;
  244.  
  245.     Node* find(int ind) {
  246.         Node* treap = this->root;
  247.         while (treap != nullptr) {
  248.             int leftSize = Size(treap);
  249.             if (leftSize == ind) {
  250.                 return treap;
  251.             }
  252.             if (leftSize < ind) {
  253.                 treap = treap->left;
  254.             } else {
  255.                 treap = treap->right;
  256.                 ind -= leftSize + 1;
  257.             }
  258.         }
  259.         return nullptr;
  260.     }
  261.  
  262.     void split(int key, Node*& treap, Node*& left, Node*& right) {
  263.         Node* newNode = nullptr;
  264.         if (treap->key < key) {
  265.             if (treap->right == nullptr) {
  266.                 right = nullptr;
  267.                 left = treap;
  268.             } else {
  269.                 split(key, treap->right, newNode, right);
  270.                 left = treap;
  271.                 left->right = newNode;
  272.             }
  273.         } else {
  274.             if (treap->left == nullptr) {
  275.                 left = nullptr;
  276.                 right = treap;
  277.             } else {
  278.                 split(key, treap->left, left, newNode);
  279.                 right = treap;
  280.                 right->left = newNode;
  281.             }
  282.         }
  283.     }
  284.  
  285.     Node* merge(Node* left, Node* right) {
  286.         if (left == nullptr) {
  287.             return right;
  288.         }
  289.         if (right == nullptr) {
  290.             return left;
  291.         }
  292.         if (right->priority > left->priority) {
  293.             Node* newNode = merge(left->right, right);
  294.             left->right = newNode;
  295.             return left;
  296.         } else {
  297.             Node* newNode = merge(left, right->left);
  298.             right->left = newNode;
  299.             return right;
  300.         }
  301.     }
  302.  
  303.     Node* insert(int key) {
  304.         if (find(key) != nullptr) {
  305.             return nullptr;
  306.         }
  307.         Node* node = Create(key);
  308.         if (root == nullptr) {
  309.             root = node;
  310.             return root;
  311.         }
  312.         Node* left, * right;
  313.         split(key, root, left, right);
  314.         left = merge(left, node);
  315.         root = merge(left, right);
  316.         return root;
  317.     }
  318.  
  319.     Node* remove(int key) {
  320.         if (find(key) == nullptr) {
  321.             return nullptr;
  322.         }
  323.         Node* left1, * left2, * right, * toDelete;
  324.         split(key - 1, root, left1, right);
  325.         split(key, left1, left2, toDelete);
  326.         delete toDelete;
  327.         root = merge(left2, right);
  328.         return root;
  329.     }
  330.  
  331. };
  332.  
  333. struct Splay {
  334.     Node* root = nullptr;
  335.  
  336.     Node* find(int key, Node* search) {
  337.         if (search == nullptr) {
  338.             return nullptr;
  339.         }
  340.         if (search->key == key) {
  341.             return splay(search);
  342.         }
  343.         if (key > search->key && search->right != nullptr) {
  344.             return find(key, search->right);
  345.         }
  346.         if (key < search->key && search->left != nullptr) {
  347.             return find(key, search->left);
  348.         }
  349.         return splay(search);
  350.     }
  351.  
  352.     void rotate(Node* par, Node* chld) {
  353.         Node* gpa = par->prev;
  354.         if (gpa != nullptr) {
  355.             if (gpa->left == par) {
  356.                 gpa->left = chld;
  357.             }
  358.             else {
  359.                 gpa->right = chld;
  360.             }
  361.         }
  362.         if (par->left == chld) {
  363.             par->left = chld->right;
  364.             if (chld->right != nullptr) {
  365.                 chld->right->prev = par;
  366.             }
  367.             chld->right = par;
  368.             par->prev = chld;
  369.         }
  370.         else {
  371.             par->right = chld->left;
  372.             if (chld->left != nullptr) {
  373.                 chld->left->prev = par;
  374.             }
  375.             chld->left = par;
  376.             par->prev = chld;
  377.         }
  378.         chld->prev = gpa;
  379.     }
  380.  
  381.     Node* splay(Node* p) {
  382.         if (p->prev == nullptr) {
  383.             return p;
  384.         }
  385.         Node* par = p->prev;
  386.         Node* gpa = p->prev->prev;
  387.         if (gpa == nullptr) {
  388.             rotate(par, p);
  389.             return p;
  390.         }
  391.         else {
  392.             if (gpa->left == par && par->left == p) {
  393.                 rotate(gpa, par);
  394.                 rotate(par, p);
  395.             }
  396.             else {
  397.                 rotate(par, p);
  398.                 rotate(gpa, p);
  399.             }
  400.             return splay(p);
  401.         }
  402.     }
  403.  
  404.     void split(Node*& p, Node*& left, Node*& right, int key) {
  405.         if (p == nullptr) {
  406.             left = nullptr;
  407.             right = nullptr;
  408.             return;
  409.         }
  410.         p = find(key, p);
  411.         if (p->key == key) {
  412.             if (p->left != nullptr) {
  413.                 p->left->prev = nullptr;
  414.             }
  415.             if (p->right != nullptr) {
  416.                 p->right->prev = nullptr;
  417.             }
  418.             right = p->right;
  419.             left = p->left;
  420.             return;
  421.         }
  422.         if (p->key < key) {
  423.             right = p->right;
  424.             p->right = nullptr;
  425.             if (right != nullptr) {
  426.                 right->prev = nullptr;
  427.             }
  428.             left = p;
  429.             p = nullptr;
  430.             return;
  431.         }
  432.         if (p->key > key) {
  433.             left = p->left;
  434.             p->left = nullptr;
  435.             if (left != nullptr) {
  436.                 left->prev = nullptr;
  437.             }
  438.             right = p;
  439.             p = nullptr;
  440.             return;
  441.         }
  442.  
  443.     }
  444.  
  445.     void insert(int key) {
  446.         Node* left, * right;
  447.         split(root, left, right, key);
  448.         if (root == nullptr) {
  449.             root = Create(key);
  450.         }
  451.         root->left = left;
  452.         root->right = right;
  453.         if (left != nullptr) {
  454.             left->prev = root;
  455.         }
  456.         if (right != nullptr) {
  457.             right->prev = root;
  458.         }
  459.     }
  460.  
  461.     Node* merge(Node* left, Node* right) {
  462.         if (left == nullptr) return right;
  463.         if (right == nullptr) return left;
  464.         right = find(left->key, right);
  465.         right->left = left;
  466.         left->prev = right;
  467.         return right;
  468.     }
  469.  
  470.     bool remove(int key) {
  471.         root = find(key, root);
  472.         if (root->key != key) {
  473.             return false;
  474.         }
  475.         Node* left = root->left, * right = root->right;
  476.         if (left != nullptr) {
  477.             left->prev = nullptr;
  478.         }
  479.         if (right != nullptr) {
  480.             right->prev = nullptr;
  481.         }
  482.         root = merge(left, right);
  483.         return true;
  484.     }
  485. };
  486.  
  487. struct RedBlack {
  488.  
  489.  
  490.     Node* root = nullptr;
  491.  
  492.     void insert(int key) {
  493.         Node* p = Create(key, 1);
  494.         if (root == nullptr) {
  495.             root = p;
  496.             p->color = 0;
  497.             return;
  498.         }
  499.         if (find(key, root) != nullptr) {
  500.             return;
  501.         }
  502.         place(p, root);
  503.         balance(p);
  504.     }
  505.  
  506.     Node* find(int key, Node* search) {
  507.         if (search == nullptr) {
  508.             return nullptr;
  509.         }
  510.         if (search->key == key) {
  511.             return search;
  512.         }
  513.         if (key > search->key) {
  514.             return find(key, search->right);
  515.         }
  516.         if (key < search->key) {
  517.             return find(key, search->left);
  518.         }
  519.     }
  520.  
  521.     void place(Node* q, Node* parent) {
  522.         if (q->key > parent->key) {
  523.             if (parent->right == nullptr) {
  524.                 parent->right = q;
  525.                 q->prev = parent;
  526.                 return;
  527.             }
  528.             place(q, parent->right);
  529.         }
  530.         else {
  531.             if (parent->left == nullptr) {
  532.                 parent->left = q;
  533.                 q->prev = parent;
  534.                 return;
  535.             }
  536.             place(q, parent->left);
  537.         }
  538.     }
  539.  
  540.     void balance(Node*& p) {
  541.         if (p->prev == nullptr) return;
  542.         if (p->prev->color == 0) return;
  543.         Node* par = p->prev, * gpa = p->prev->prev;
  544.         Node* bro = (par == gpa->left ? gpa->right : gpa->left);
  545.         if (bro != nullptr && bro->color == 1) {
  546.             par->color = 0;
  547.             bro->color = 0;
  548.             balance(gpa);
  549.         }
  550.         if (CheckColor(bro)) {
  551.             if (p == par->right && par == gpa->left) {
  552.                 p->prev = gpa;
  553.                 par->prev = p;
  554.                 par->right = p->left;
  555.                 p->left = par;
  556.                 gpa->left = p;
  557.                 std::swap(par, p);
  558.             }
  559.             else if (p == par->left && par == gpa->right) {
  560.                 p->prev = gpa;
  561.                 par->prev = p;
  562.                 par->left = p->right;
  563.                 p->right = par;
  564.                 gpa->right = p;
  565.                 std::swap(par, p);
  566.             }
  567.             if (gpa->left == par) {
  568.                 if (gpa->prev == nullptr) {
  569.                     root = par;
  570.                 }
  571.                 else {
  572.                     if (gpa->prev->left == gpa) {
  573.                         gpa->prev->left = par;
  574.                     }
  575.                     else {
  576.                         gpa->prev->right = par;
  577.                     }
  578.                 }
  579.                 par->prev = gpa->prev;
  580.                 gpa->prev = par;
  581.                 gpa->left = par->right;
  582.                 if (par->right != nullptr) {
  583.                     par->right->prev = gpa;
  584.                 }
  585.                 par->right = gpa;
  586.             }
  587.             else {
  588.                 if (gpa->prev == nullptr) {
  589.                     root = par;
  590.                 }
  591.                 else {
  592.                     if (gpa->prev->left == gpa) {
  593.                         gpa->prev->left = par;
  594.                     }
  595.                     else {
  596.                         gpa->prev->right = par;
  597.                     }
  598.                 }
  599.                 par->prev = gpa->prev;
  600.                 gpa->prev = par;
  601.                 gpa->right = par->left;
  602.                 if (par->left != nullptr) {
  603.                     par->left->prev = gpa;
  604.                 }
  605.                 par->left = gpa;
  606.             }
  607.             par->color = 0;
  608.             gpa->color = 1;
  609.             return;
  610.         }
  611.     }
  612.  
  613.     bool erase(int key) {
  614.         Node* q = find(key, root);
  615.         if (q == nullptr) {
  616.             return false;
  617.         }
  618.         Node* min = findMin(q->right);
  619.         if (min == nullptr) min = q;
  620.         q->key = min->key;
  621.         if (!CheckColor(min)) {
  622.             if (min->prev->left == min) {
  623.                 min->prev->left = nullptr;
  624.             }
  625.             else {
  626.                 min->prev->right = nullptr;
  627.             }
  628.             delete min;
  629.             return true;
  630.         }
  631.         if (!CheckColor(min->right)) {
  632.             if (min->right != nullptr) {
  633.                 min->right->prev = q->prev;
  634.                 if (min->prev->left == min) {
  635.                     min->prev->left = min->right;
  636.                 }
  637.                 else {
  638.                     min->prev->right = min->right;
  639.                 }
  640.                 min->left->color = 0;
  641.                 delete min;
  642.                 return true;
  643.             }
  644.         }
  645.        
  646.         Node* toDelete = min;
  647.         if (min->prev == nullptr) {
  648.             root = nullptr;
  649.             delete min;
  650.             return true;
  651.         }
  652.         if (min->prev->left == min) {
  653.             min->prev->left = min->right;
  654.         }
  655.         else {
  656.             min->prev->right = min->right;
  657.         }
  658.         min = min->right;
  659.         delete toDelete;
  660.         rbalance(min);
  661.         return true;
  662.     }
  663.  
  664.     void rbalance(Node* p) {
  665.         if (p == nullptr) {
  666.             return;
  667.         }
  668.         Node* par = p->prev, * bro = (p == par->left ? par->right : par->left);
  669.         Node* d1 = bro->right, * d2 = bro->left;
  670.         if (CheckColor(par) && CheckColor(bro) && CheckColor(d1) && CheckColor(d2)) {
  671.             bro->color = 1;
  672.             rbalance(par);
  673.             return;
  674.         }
  675.         if (!CheckColor(par) && CheckColor(bro) && CheckColor(d1) && CheckColor(d2)) {
  676.             par->color = 0;
  677.             bro->color = 1;
  678.             return;
  679.         }
  680.         if (CheckColor(bro) && CheckColor(d1) && !CheckColor(d2)) {
  681.             bro->prev = par->prev;
  682.             if (par->prev != nullptr) {
  683.                 if (par->prev->right == par) {
  684.                     par->prev->right = bro;
  685.                 }
  686.                 else {
  687.                     par->prev->left = bro;
  688.                 }
  689.             }
  690.             d2->color = 0;
  691.             par->right = d1;
  692.             bro->left = par;
  693.             par->prev = bro;
  694.             return;
  695.         }
  696.         if (CheckColor(bro) && !CheckColor(d1) && CheckColor(d2)) {
  697.             par->right = d1;
  698.             d1->prev = par;
  699.             bro->prev = d1;
  700.             bro->left = d1->right;
  701.             d1->right = bro;
  702.             d1->color = 0;
  703.             bro->color = 1;
  704.             std::swap(d1, bro);
  705.             std::swap(d1, d2);
  706.             bro->prev = par->prev;
  707.             if (par->prev != nullptr) {
  708.                 if (par->prev->right == par) {
  709.                     par->prev->right = bro;
  710.                 }
  711.                 else {
  712.                     par->prev->left = bro;
  713.                 }
  714.             }
  715.             d2->color = 0;
  716.             par->right = bro->left;
  717.             bro->left = par;
  718.             par->prev = bro;
  719.             return;
  720.         }
  721.         if (!CheckColor(bro)) {
  722.             if (par->prev != nullptr) {
  723.                 if (par->prev->right == par) {
  724.                     par->prev->right = bro;
  725.                 }
  726.                 else {
  727.                     par->prev->left = bro;
  728.                 }
  729.             }
  730.             bro->prev = par->prev;
  731.             par->prev = bro;
  732.             par->right = d1;
  733.             bro->left = par;
  734.             par->color = 1;
  735.             bro->color = 0;
  736.             if (d2 != nullptr) {
  737.                 d2->color = 1;
  738.             }
  739.             balance(p);
  740.             return;
  741.         }
  742.         return;
  743.     }
  744.  
  745.     Node* findMin(Node* p) {
  746.         if (p == nullptr) {
  747.             return nullptr;
  748.         }
  749.         if (p->left == nullptr) {
  750.             return p;
  751.         }
  752.         return findMin(p->left);
  753.     }
  754. };
  755.  
  756.  
  757.  
  758. void InOrder(Node* p, int layer = 0) {
  759.     if (p == nullptr) return;
  760.     InOrder(p->left, layer + 1);
  761.     std::cout << p->key << " ";
  762.     InOrder(p->right, layer + 1);
  763. }
  764.  
  765. void TreeOrder(Node* p) {
  766.     int layer = 0;
  767.     std::queue<std::pair<Node*, int>> queue;
  768.     std::pair<Node*, int> blank;
  769.     if (p != nullptr) {
  770.         blank = { p, layer };
  771.         queue.push(blank);
  772.     }
  773.     while (!queue.empty()) {
  774.         if (queue.front().second > layer) {
  775.             std::cout << "\n";
  776.             ++layer;
  777.         }
  778.         Node* q = queue.front().first;
  779.         std::cout << q->key << " ";
  780.         queue.pop();
  781.         if (q->left != nullptr) {
  782.             blank.second = layer + 1;
  783.             blank.first = q->left;
  784.             queue.push(blank);
  785.         }
  786.         if (q->right != nullptr) {
  787.             blank.second = layer + 1;
  788.             blank.first = q->right;
  789.             queue.push(blank);
  790.         }
  791.     }
  792. }
  793.  
  794.  
  795. sf::Font* font;
  796.  
  797. sf::Color textColor = sf::Color(232, 197, 71), backgroundColor = sf::Color(34, 40, 49), elementColor = sf::Color(254, 233, 225), fillColor = sf::Color(57, 62, 70), reactColor = sf::Color(217, 3, 104);
  798.  
  799. struct RenderNode {
  800.     sf::RectangleShape rect;
  801.     sf::Text text;
  802.     int height = 0;
  803.     Node* node = nullptr;
  804.     int key = 0;
  805.     sf::Vector2f scale;
  806.     RenderNode* left = nullptr, * right = nullptr;
  807.  
  808.     void create(Node* node, int key, int height, float scale) {
  809.         this->node = node;
  810.         this->key = key;
  811.         this->text.setString(std::to_string(key));
  812.         this->height = height;
  813.  
  814.         sf::Vector2f sc = { scale, scale };
  815.         this->scale = sc;
  816.  
  817.         rect.setSize(sf::Vector2f(150, 60));
  818.  
  819.         //text.setOrigin(text.getGlobalBounds().width / 2, text.getGlobalBounds().height / 2);
  820.         rect.setOrigin(75, 30);
  821.         text.setOrigin(75, 20);
  822.  
  823.         text.setFont(*font);
  824.         rect.setOutlineThickness(1);
  825.  
  826.         rect.setFillColor(fillColor);
  827.         text.setFillColor(textColor);
  828.         rect.setOutlineColor(elementColor);
  829.  
  830.         text.setScale(this->scale);
  831.         rect.setScale(this->scale);
  832.     }
  833.  
  834.     void grow(sf::Vector2f scale) {
  835.         this->scale = scale;
  836.         text.setScale(scale);
  837.         rect.setScale(scale);
  838.     }
  839.  
  840.     void setPos(sf::Vector2f pos) {
  841.         rect.setPosition(pos);
  842.         text.setPosition(pos);
  843.     }
  844.  
  845.     void draw(sf::RenderWindow& window) {
  846.         window.draw(rect);
  847.         window.draw(text);
  848.     }
  849. };
  850.  
  851. struct RenderTree {
  852.     std::vector<sf::Vertex> connections;
  853.     RenderNode* root = nullptr;
  854.     int height;
  855.  
  856.     void create(Node* tree, sf::Vector2f pos, float scale) {
  857.         int height = 0;
  858.         RenderNode* rend = createNodes(tree, height, scale);
  859.         root = rend;
  860.         positionNodes(rend, pos, height);
  861.         this->height = height;
  862.     }
  863.  
  864.     void positionNodes(RenderNode* rend, sf::Vector2f pos, int height) {
  865.         if (rend == nullptr) return;
  866.         rend->setPos(pos);
  867.         positionNodes(rend->left, { pos.x - 80 * (int)pow(2, height - 2) * rend->scale.x, pos.y + 200 * rend->scale.x }, height - 1);
  868.         positionNodes(rend->right, { pos.x + 80 * (int)pow(2, height - 2) * rend->scale.x , pos.y + 200 * rend->scale.x}, height - 1);
  869.         return;
  870.     }
  871.  
  872.     RenderNode* createNodes(Node* tree, int& height, float scale) {
  873.         if (tree == nullptr) {
  874.             return nullptr;
  875.         }
  876.        
  877.         int h1 = height, h2 = height;
  878.         RenderNode* rend = new RenderNode;
  879.         rend->left = createNodes(tree->left, h1, scale);
  880.         rend->right = createNodes(tree->right, h2, scale);
  881.         height = std::max(h1, h2) + 1;
  882.         rend->create(tree, tree->key, height, scale);
  883.         return rend;
  884.     }
  885.  
  886.     void scale(RenderNode* rend, float scaleNum) {
  887.         if (rend == nullptr) return;
  888.         sf::Vector2f s = { scaleNum, scaleNum };
  889.         rend->grow(s);
  890.         scale(rend->left, scaleNum);
  891.         scale(rend->right, scaleNum);
  892.     }
  893.  
  894.     void draw(sf::RenderWindow& window) {
  895.        
  896.         drawNodes(window, root);
  897.     }
  898.  
  899.     void drawNodes(sf::RenderWindow& window, RenderNode* rend) {
  900.         if (rend == nullptr) return;
  901.         if (rend->left != nullptr) {
  902.             sf::Vector2f pos1, pos2;
  903.             pos1 = { rend->rect.getPosition().x, rend->rect.getPosition().y };
  904.             pos2 = { rend->left->rect.getPosition().x, rend->left->rect.getPosition().y};
  905.             sf::Vertex line[] = {
  906.                 sf::Vertex(pos1),
  907.                 sf::Vertex(pos2)
  908.             };
  909.             window.draw(line, 2, sf::Lines);
  910.         }
  911.         if (rend->right != nullptr) {
  912.             sf::Vector2f pos1, pos2;
  913.             pos1 = { rend->rect.getPosition().x, rend->rect.getPosition().y };
  914.             pos2 = { rend->right->rect.getPosition().x, rend->right->rect.getPosition().y };
  915.             sf::Vertex line[] = {
  916.                 sf::Vertex(pos1),
  917.                 sf::Vertex(pos2)
  918.             };
  919.             window.draw(line, 2, sf::Lines);
  920.         }
  921.         rend->draw(window);
  922.         drawNodes(window, rend->left);
  923.         drawNodes(window, rend->right);
  924.     }
  925.  
  926.     void clear() {
  927.         connections.clear();
  928.         clearNodes(root);
  929.         root = nullptr;
  930.     }
  931.  
  932.     void clearNodes(RenderNode* rend) {
  933.         if (rend == nullptr) {
  934.             return;
  935.         }
  936.         clearNodes(rend->left);
  937.         clearNodes(rend->right);
  938.         delete rend;
  939.     }
  940.  
  941.    /* bool contains(float x, float y, int type, RenderNode* node = nullptr, bool first = false) {
  942.         if (node == nullptr && !first) {
  943.             node = root;
  944.             first = true;
  945.         }
  946.         if (node == nullptr) return;
  947.         if (node->rect.getGlobalBounds().contains(x, y)) {
  948.             erase()
  949.         }
  950.     }*/
  951. };
  952.  
  953. void InOrder2(RenderNode* p, int layer = 0) {
  954.     if (p == nullptr) return;
  955.     InOrder2(p->left, layer + 1);
  956.     std::cout << p->key << " ";
  957.     InOrder2(p->right, layer + 1);
  958. }
  959.  
  960. void UpdateText(sf::Text& text, std::string s) {
  961.     text.setString(s);
  962. }
  963.  
  964. void MousePressed(float x, float y) {
  965.    
  966. }
  967.  
  968. int Convetr(std::string s) {
  969.     bool minus = false;
  970.     int i = 0, ans = 0;
  971.     if (s[i] == '-') {
  972.         minus == true;
  973.         ++i;
  974.     }
  975.     while (i < s.size()) {
  976.         ans *= 10;
  977.         ans += s[i] - '0';
  978.         ++i;
  979.     }
  980.     if (minus) {
  981.         ans = -ans;
  982.     }
  983.     return ans;
  984. }
  985.  
  986. int main() {
  987.     sf::RenderWindow window(sf::VideoMode(1000, 1000), "FUNKY GROOVY COME TO THE CLUB FOR FREE AND GET YOURSELF A FREE DRINK");
  988.  
  989.     //RedBlack splay;
  990.     RenderTree renderTree;
  991.     sf::Vertex line[] =
  992.     {
  993.         sf::Vertex(sf::Vector2f(10.f, 10.f)),
  994.         sf::Vertex(sf::Vector2f(150.f, 150.f))
  995.     };
  996.  
  997.     std::string addText, delText;
  998.     sf::RectangleShape box1, box2, button1, button2, treet1, treet2, treet3, treet4;
  999.     sf::Text text1, text2, text3, text4;
  1000.    
  1001.     text1.setPosition(800, 196);
  1002.     text2.setPosition(800, 296);
  1003.     text3.setPosition(802, 234);
  1004.     text4.setPosition(802, 334);
  1005.  
  1006.     text1.setOutlineThickness(2);
  1007.     text3.setFillColor(textColor);
  1008.     text4.setFillColor(textColor);
  1009.     text1.setFillColor(textColor);
  1010.     text2.setOutlineThickness(2);
  1011.     text3.setOutlineThickness(2);
  1012.     text4.setOutlineThickness(2);
  1013.     text2.setFillColor(textColor);
  1014.        
  1015.     box1.setSize(sf::Vector2f(150, 30));
  1016.     box2.setSize(sf::Vector2f(150, 30));
  1017.  
  1018.     box1.setPosition(800, 200);
  1019.     box2.setPosition(800, 300);
  1020.  
  1021.     box1.setOutlineThickness(2);
  1022.     box1.setOutlineColor(elementColor);
  1023.     box1.setFillColor(fillColor);
  1024.     box2.setOutlineThickness(2);
  1025.     box2.setOutlineColor(elementColor);
  1026.     box2.setFillColor(fillColor);
  1027.  
  1028.     button1.setSize(sf::Vector2f(50, 30));
  1029.     button2.setSize(sf::Vector2f(50, 30));
  1030.  
  1031.     button1.setPosition(800, 240);
  1032.     button2.setPosition(800, 340);
  1033.  
  1034.     button1.setOutlineThickness(2);
  1035.     button1.setOutlineColor(elementColor);
  1036.     button1.setFillColor(fillColor);
  1037.     button2.setOutlineThickness(2);
  1038.     button2.setOutlineColor(elementColor);
  1039.     button2.setFillColor(fillColor);
  1040.    
  1041.     treet1.setSize(sf::Vector2f(50, 30));
  1042.     treet2.setSize(sf::Vector2f(50, 30));
  1043.     treet3.setSize(sf::Vector2f(50, 30));
  1044.     treet4.setSize(sf::Vector2f(50, 30));
  1045.  
  1046.     treet1.setPosition(50, 950);
  1047.     treet2.setPosition(130, 950);
  1048.     treet3.setPosition(210, 950);
  1049.     treet4.setPosition(290, 950);
  1050.  
  1051.     treet1.setOutlineThickness(2);
  1052.     treet1.setOutlineColor(elementColor);
  1053.     treet1.setFillColor(fillColor);
  1054.     treet2.setOutlineThickness(2);
  1055.     treet2.setOutlineColor(elementColor);
  1056.     treet2.setFillColor(fillColor);
  1057.     treet3.setOutlineThickness(2);
  1058.     treet3.setOutlineColor(elementColor);
  1059.     treet3.setFillColor(fillColor);
  1060.     treet4.setOutlineThickness(2);
  1061.     treet4.setOutlineColor(elementColor);
  1062.     treet4.setFillColor(fillColor);
  1063.  
  1064.  
  1065.  
  1066.     font = new sf::Font;
  1067.     if (!font->loadFromFile("UbuntuMono-Regular.ttf")) {
  1068.         std::cout << "err\n";
  1069.     }
  1070.  
  1071.     text1.setFont(*font);
  1072.     text2.setFont(*font);
  1073.     text3.setFont(*font);
  1074.     text4.setFont(*font);
  1075.  
  1076.     text3.setString("ADD");
  1077.     text4.setString("DEL");
  1078.    
  1079.     sf::Vector2f treePos = { 500, 50 };
  1080.     float scale = 1;
  1081.     int selected = 0;
  1082.     bool minus1 = false, minus2 = false;
  1083.  
  1084.     int treeType = 0;
  1085.     Avl avl;
  1086.     RedBlack redBlack;
  1087.     Treap treap;
  1088.     Splay splay;
  1089.  
  1090.     while (window.isOpen()) {
  1091.  
  1092.  
  1093.          sf::Event event;
  1094.          while (window.pollEvent(event)) {
  1095.              if (event.type == sf::Event::Closed) {
  1096.                  window.close();
  1097.              }
  1098.              if (event.type == sf::Event::KeyPressed) {
  1099.                  if (event.key.code == sf::Keyboard::Enter) {
  1100.                      if (selected == 1) {
  1101.                          int ans = Convetr(addText);
  1102.                          addText.clear();
  1103.                          UpdateText(text1, addText);
  1104.                          avl.insert(ans, avl.root);
  1105.                          redBlack.insert(ans);
  1106.                          treap.insert(ans);
  1107.                          splay.insert(ans);
  1108.                          if (treeType == 0) {
  1109.                              renderTree.create(avl.root, treePos, scale);
  1110.                          }
  1111.                          if (treeType == 1) {
  1112.                              renderTree.create(redBlack.root, treePos, scale);
  1113.                          }
  1114.                          if (treeType == 2) {
  1115.                              renderTree.create(treap.root, treePos, scale);
  1116.                          }
  1117.                          if (treeType == 3) {
  1118.                              renderTree.create(splay.root, treePos, scale);
  1119.                          }
  1120.                      }
  1121.                      if (selected == 2) {
  1122.                          int ans = Convetr(delText);
  1123.                          delText.clear();
  1124.                          UpdateText(text1, delText);
  1125.                          avl.remove(ans, avl.root);
  1126.                          redBlack.erase(ans);
  1127.                          treap.remove(ans);
  1128.                          splay.remove(ans);
  1129.                      }
  1130.                  }
  1131.                  if (event.key.code == sf::Keyboard::P) {
  1132.                      if (scale <= 0.2) {
  1133.                          scale += 0.02;
  1134.                      }
  1135.                      else {
  1136.                          scale += 0.1;
  1137.                      }
  1138.  
  1139.                      renderTree.scale(renderTree.root, scale);
  1140.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1141.                  }
  1142.                  if (event.key.code == sf::Keyboard::O) {
  1143.                      if (scale <= 0.2 && scale > 0.02) {
  1144.                          scale -= 0.02;
  1145.                          renderTree.scale(renderTree.root, scale);
  1146.                          renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1147.                      }
  1148.                      else if (scale > 0.2) {
  1149.                          scale -= 0.1;
  1150.                          renderTree.scale(renderTree.root, scale);
  1151.                          renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1152.                      }
  1153.  
  1154.                  }
  1155.                  if (event.key.code == sf::Keyboard::Up) {
  1156.                      treePos.y += 5 * scale * 10;
  1157.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1158.                  }
  1159.                  if (event.key.code == sf::Keyboard::Down) {
  1160.                      treePos.y -= 5 * scale * 10;
  1161.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1162.                  }
  1163.                  if (event.key.code == sf::Keyboard::Left) {
  1164.                      treePos.x += 5 * scale * 10;
  1165.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1166.                  }
  1167.                  if (event.key.code == sf::Keyboard::Right) {
  1168.                      treePos.x -= 5 * scale * 10;
  1169.                      renderTree.positionNodes(renderTree.root, treePos, renderTree.height);
  1170.                  }
  1171.                  if (event.key.code == sf::Keyboard::BackSpace) {
  1172.                      if (selected == 1) {
  1173.                          if (addText.size() > 0) {
  1174.                              addText.pop_back();
  1175.                              UpdateText(text1, addText);
  1176.                          }
  1177.                      }
  1178.                      if (selected == 2) {
  1179.                          if (delText.size() > 0) {
  1180.                              delText.pop_back();
  1181.                              UpdateText(text2, delText);
  1182.                          }
  1183.                      }
  1184.                  }
  1185.                  
  1186.              }
  1187.              if (event.type == sf::Event::TextEntered) {
  1188.                  if (selected == 1) {
  1189.                      if (addText.size() == 0) {
  1190.                          if (event.text.unicode == '-') {
  1191.                              minus1 = true;
  1192.                              addText += event.text.unicode;
  1193.                          }
  1194.                          else {
  1195.                              minus1 = false;
  1196.                          }
  1197.                      }
  1198.                      if (event.text.unicode >= '0' && event.text.unicode <= '9' && (addText.size() < 9 || addText.size() < 10 && minus1)) {
  1199.                          addText += event.text.unicode;
  1200.                      }
  1201.                      UpdateText(text1, addText);
  1202.                  }
  1203.                  if (selected == 2) {
  1204.                      if (event.text.unicode == '-') {
  1205.                          minus2 = true;
  1206.                          delText += event.text.unicode;
  1207.                      }
  1208.                      else {
  1209.                          minus2 = false;
  1210.                      }
  1211.                      if (event.text.unicode >= '0' && event.text.unicode <= '9' && (delText.size() < 9 || delText.size() < 10 && minus2)) {
  1212.                          delText += event.text.unicode;
  1213.                      }
  1214.                      UpdateText(text2, delText);
  1215.                  }
  1216.                  
  1217.              }
  1218.              if (event.type == sf::Event::MouseButtonPressed) {
  1219.                  if (box1.getGlobalBounds().contains(event.mouseButton.x, event.mouseButton.y)) {
  1220.                      selected = 1;
  1221.                      box1.setOutlineColor(reactColor);
  1222.                      box2.setOutlineColor(elementColor);
  1223.                  }
  1224.                  else if (box2.getGlobalBounds().contains(event.mouseButton.x, event.mouseButton.y)) {
  1225.                      selected = 2;
  1226.                      box2.setOutlineColor(reactColor);
  1227.                      box1.setOutlineColor(elementColor);
  1228.                  }
  1229.                  else {
  1230.                      selected = 0;
  1231.                      box2.setOutlineColor(elementColor);
  1232.                      box1.setOutlineColor(elementColor);
  1233.                  }
  1234.                  if (button1.getGlobalBounds().contains(event.mouseButton.x, event.mouseButton.y)) {
  1235.                      int ans = Convetr(addText);
  1236.                      addText.clear();
  1237.                      UpdateText(text1, addText);
  1238.                      avl.insert(ans, avl.root);
  1239.                      redBlack.insert(ans);
  1240.                      treap.insert(ans);
  1241.                      splay.insert(ans);
  1242.                      if (treeType == 0) {
  1243.                          renderTree.create(avl.root, treePos, scale);
  1244.                      }
  1245.                      if (treeType == 1) {
  1246.                          renderTree.create(redBlack.root, treePos, scale);
  1247.                      }
  1248.                      if (treeType == 2) {
  1249.                          renderTree.create(treap.root, treePos, scale);
  1250.                      }
  1251.                      if (treeType == 3) {
  1252.                          renderTree.create(splay.root, treePos, scale);
  1253.                      }
  1254.                  }
  1255.                  if (button2.getGlobalBounds().contains(event.mouseButton.x, event.mouseButton.y)) {
  1256.                      int ans = Convetr(delText);
  1257.                      delText.clear();
  1258.                      UpdateText(text1, delText);
  1259.                      avl.remove(ans, avl.root);
  1260.                      redBlack.erase(ans);
  1261.                      treap.remove(ans);
  1262.                      splay.remove(ans);
  1263.                  }
  1264.                  if (treet1.getGlobalBounds().contains(event.mouseButton.x, event.mouseButton.y)) {
  1265.                      treeType = 0;
  1266.                      treet1.setOutlineColor(reactColor);
  1267.                      treet2.setOutlineColor(elementColor);
  1268.                      treet3.setOutlineColor(elementColor);
  1269.                      treet4.setOutlineColor(elementColor);
  1270.                      renderTree.create(avl.root, treePos, scale);
  1271.                  }
  1272.                  if (treet2.getGlobalBounds().contains(event.mouseButton.x, event.mouseButton.y)) {
  1273.                      treeType = 1;
  1274.                      treet2.setOutlineColor(reactColor);
  1275.                      treet1.setOutlineColor(elementColor);
  1276.                      treet3.setOutlineColor(elementColor);
  1277.                      treet4.setOutlineColor(elementColor);
  1278.                      renderTree.create(redBlack.root, treePos, scale);
  1279.                  }
  1280.                  if (treet3.getGlobalBounds().contains(event.mouseButton.x, event.mouseButton.y)) {
  1281.                      treeType = 2;
  1282.                      treet3.setOutlineColor(reactColor);
  1283.                      treet2.setOutlineColor(elementColor);
  1284.                      treet1.setOutlineColor(elementColor);
  1285.                      treet4.setOutlineColor(elementColor);
  1286.                      renderTree.create(treap.root, treePos, scale);
  1287.                  }
  1288.                  if (treet4.getGlobalBounds().contains(event.mouseButton.x, event.mouseButton.y)) {
  1289.                      treeType = 3;
  1290.                      treet4.setOutlineColor(reactColor);
  1291.                      treet2.setOutlineColor(elementColor);
  1292.                      treet3.setOutlineColor(elementColor);
  1293.                      treet1.setOutlineColor(elementColor);
  1294.                      renderTree.create(splay.root, treePos, scale);
  1295.                  }
  1296.              }
  1297.          }
  1298.          
  1299.  
  1300.          window.clear(backgroundColor);
  1301.  
  1302.          renderTree.draw(window);
  1303.          window.draw(box1);
  1304.          window.draw(button2);
  1305.          window.draw(button1);
  1306.          window.draw(box2);
  1307.  
  1308.          window.draw(treet1);
  1309.          window.draw(treet2);
  1310.          window.draw(treet3);
  1311.          window.draw(treet4);
  1312.  
  1313.          window.draw(text1);
  1314.          window.draw(text3);
  1315.          window.draw(text4);
  1316.          window.draw(text2);
  1317.  
  1318.          window.display();
  1319.     }
  1320. }
  1321.  
  1322. /*
  1323. Avl avl;
  1324.     while (true) {
  1325.         int a;
  1326.         std::cin >> a;
  1327.         if (a == 0) {
  1328.             InOrder(avl.root);
  1329.             std::cout << "\n";
  1330.             TreeOrder(avl.root);
  1331.         }
  1332.         if (a == 1) {
  1333.             int key;
  1334.             std::cin >> key;
  1335.             std::cout << avl.insert(key, avl.root) << "\n";
  1336.         }
  1337.         if (a == 2) {
  1338.             int key;
  1339.             std::cin >> key;
  1340.             std::cout << avl.remove(key, avl.root) << "\n";
  1341.         }
  1342.         if (a >= 3) {
  1343.             for (int i = 0; i < a; ++i) {
  1344.                 int k;
  1345.                 int key;
  1346.                 std::cin >> key;
  1347.                 std::cout << avl.insert(key, avl.root) << "\n";
  1348.             }
  1349.         }
  1350.     }
  1351. */
  1352.  
  1353. /*
  1354. 5
  1355. 3 10 15 30 29
  1356.  
  1357.  
  1358. 437
  1359. 3485
  1360. 238
  1361. 483
  1362. 285
  1363. 22
  1364. 355
  1365. 348
  1366. 345
  1367. 23
  1368. 25699
  1369. 8346867
  1370. 934988
  1371. 483276
  1372. 2931
  1373. 59328528
  1374. 283582385
  1375. 38723
  1376. 237582358
  1377. 2
  1378. 32735285
  1379. 69
  1380. 1585
  1381. 3382
  1382. 384
  1383. 23415
  1384. 2643
  1385. 523
  1386. 247724
  1387. 999999999
  1388. 556
  1389. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement