Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int mod = 1e9;
  6.  
  7. struct Node{
  8. Node *left, *right;
  9. int y = rand(), x;
  10. };
  11.  
  12. vector<Node> tree(200000);
  13. int POS = 0;
  14.  
  15. void split(Node *treap, Node *&left, Node *&right, int x){
  16. if (treap == NULL){
  17. left = right = NULL;
  18. return;
  19. }
  20. if (treap->x < x){
  21. left = treap;
  22. split(treap->right, treap->right, right, x);
  23. }
  24. else{
  25. right = treap;
  26. split(treap->left, left, treap->left, x);
  27. }
  28. }
  29.  
  30. void merge(Node *&treap, Node *left, Node *right){
  31. if (left == NULL){
  32. treap = right;
  33. return;
  34. }
  35. if (right == NULL){
  36. treap = left;
  37. return;
  38. }
  39. if (left->y > right->y){
  40. treap = left;
  41. merge(treap->right, treap->right, right);
  42. }
  43. else{
  44. treap = right;
  45. merge(treap->left, left, treap->left);
  46. }
  47. }
  48.  
  49. void out(Node *treap){
  50. if (treap == NULL)
  51. return;
  52. out(treap->left);
  53. cout << treap->x << " ";
  54. out(treap->right);
  55. }
  56.  
  57. int get(Node *treap){
  58. if (treap->left == NULL)
  59. return treap->x;
  60. return get(treap->left);
  61. }
  62.  
  63. int main(){
  64. // freopen("swapper.in", "r", stdin);
  65. // freopen("swapper.out", "w", stdout);
  66. cin.tie(0);
  67. ios_base::sync_with_stdio(false);
  68. int n, x, prev = 0;
  69. cin >> n;
  70.  
  71. char act;
  72. Node *treap = NULL;
  73. Node *left, *right;
  74. for (int i = 0; i < n; i++){
  75. cin >> act >> x;
  76. if (act == '+'){
  77. x = (x + prev) % mod;
  78. prev = 0;
  79. split(treap, left, right, x);
  80. if (right == NULL || get(right) != x){
  81. tree[POS].x = x;
  82. Node *mid = &tree[POS++];
  83. merge(treap, left, mid);
  84. merge(treap, treap, right);
  85. }
  86. else merge(treap, left, right);
  87. }
  88. else{
  89. split(treap, left, right, x);
  90. if (right == NULL)
  91. prev = -1;
  92. else
  93. prev = get(right);
  94. merge(treap, left, right);
  95. cout << prev << "\n";
  96. }
  97. // cout << "i: " << i << endl;
  98. // out(treap); cout << endl;
  99. }
  100. return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement