Advertisement
Guest User

Untitled

a guest
May 20th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4.  
  5. class Tree {
  6. public:
  7. Tree(std::string& value);
  8. Tree();
  9. struct Vertex {
  10. std::string key;
  11. int prior;
  12. int depth;
  13. Vertex* left;
  14. Vertex* right;
  15.  
  16. Vertex(std::string& value);
  17. void UpdateDepth();
  18. };
  19.  
  20. void insert( int pos, std::string& value );
  21. void remove( int pos );
  22. std::string str( int pos );
  23. private:
  24. Vertex* Merge( Vertex* first, Vertex* second );
  25. std::pair<Vertex*, Vertex*> Split( Vertex* spliting, int pos );
  26. Vertex* root;
  27. };
  28.  
  29. Tree::Tree() : root(nullptr) {}
  30.  
  31. Tree::Vertex::Vertex( std::string& value ): key(value), prior(rand()), depth(1), left(nullptr), right(nullptr) {}
  32.  
  33. Tree::Tree( std::string& value ) : root(new Vertex(value)) {}
  34.  
  35. void Tree::Vertex::UpdateDepth() {
  36. depth = 1;
  37. if (left != nullptr)
  38. depth += left->depth;
  39. if (right != nullptr)
  40. depth += right->depth;
  41. }
  42.  
  43. Tree::Vertex* Tree::Merge(Tree::Vertex *first, Tree::Vertex *second) {
  44. if( second == nullptr )
  45. return first;
  46. if( first == nullptr )
  47. return second;
  48. if( first->prior > second->prior ) {
  49. first->right = Merge(first->right, second);
  50. first->UpdateDepth();
  51. return first;
  52. } else {
  53. second->left = Merge(first, second->left);
  54. second->UpdateDepth();
  55. return second;
  56. }
  57. }
  58.  
  59. std::pair<Tree::Vertex*, Tree::Vertex*> Tree::Split( Tree::Vertex* spliting, int pos ) {
  60. if( spliting == nullptr )
  61. return std::make_pair(nullptr, nullptr);
  62. int left = 0;
  63. if( spliting->left != nullptr)
  64. left = spliting->left->depth;
  65. if( left >= pos ) {
  66. std::pair<Tree::Vertex*, Tree::Vertex*> ans = Split(spliting->left, pos);
  67. spliting->left = ans.second;
  68. spliting->UpdateDepth();
  69. return std::make_pair(ans.first, spliting);
  70. } else {
  71. std::pair<Tree::Vertex*, Tree::Vertex*> ans = Split(spliting->right, pos - left - 1);
  72. spliting->right = ans.first;
  73. spliting->UpdateDepth();
  74. return std::make_pair(spliting, ans.second);
  75. }
  76. }
  77.  
  78.  
  79. void Tree::insert( int pos, std::string& value ) {
  80. Vertex* tmp = new Vertex(value);
  81. auto res = Split(root, pos);
  82. auto merged = Merge(tmp, res.second);
  83. root = Merge(merged, res.first);
  84. }
  85.  
  86. void Tree::remove( int pos ) {
  87. auto res = Split(root, pos);
  88. auto deleted = Split(res.second, 1);
  89. delete deleted.first;
  90. Merge(deleted.second, res.first);
  91. }
  92.  
  93. std::string Tree::str( int pos ) {
  94. auto res = Split(root, pos);
  95. auto deleted = Split(res.second, 1);
  96. auto half = Merge(deleted.first, deleted.second);
  97. root = Merge(half, res.first);
  98. return deleted.first->key;
  99. }
  100.  
  101. int main() {
  102. Tree tree;
  103. int n = 0;
  104. std::cin >> n;
  105.  
  106. for( int i = 0; i < n; i++ ) {
  107. std::string str;
  108. std::cin >> str;
  109.  
  110. if( str == "+" ) {
  111. std::string value;
  112. int pos = 0;
  113. std::cin >> pos;
  114. std::cin >> value;
  115. tree.insert(pos, value);
  116. } else if( str == "-" ) {
  117. int pos = 0;
  118. std::cin >> pos;
  119. tree.remove(pos);
  120. } else if( str == "?" ) {
  121. int pos = 0;
  122. std::cin >> pos;
  123. std::cout << tree.str(pos);
  124. }
  125.  
  126. }
  127.  
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement