Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7. long long mod = 1e9;
  8. struct Treap {
  9.     long long key;
  10.     int prior;
  11.     Treap *left, *right;
  12.     Treap(long long key):key(key), left(NULL), right(NULL) { this->prior = rand(); }
  13. };
  14.  
  15. Treap *merge_(Treap *l, Treap *r) {
  16.     if (r == NULL) {
  17.         return l;
  18.     }
  19.     if (l == NULL) {
  20.         return r;
  21.     }
  22.     if (l->prior < r->prior) {
  23.         r->left = merge_(l, r->left);
  24.         return r;
  25.     }
  26.     else {
  27.         l->right = merge_(l->right, r);
  28.         return l;
  29.     }
  30. }
  31.  
  32. void split(Treap *root, long long key, Treap *&l, Treap *&r) {
  33.     if (root == NULL) {
  34.         l = r = NULL;
  35.         return;
  36.     }
  37.     if (root->key < key) {
  38.         Treap *tmp_l = NULL, *tmp_r = NULL;
  39.         split(root->right, key, tmp_l, tmp_r);
  40.         root->right = tmp_l;
  41.         l = root, r = tmp_r;
  42.         return;
  43.     }
  44.     else {
  45.         Treap *tmp_l = NULL, *tmp_r = NULL;
  46.         split(root->left, key, tmp_l, tmp_r);
  47.         root->left = tmp_r;
  48.         l = tmp_l, r = root;
  49.         return;
  50.     }
  51. }
  52.  
  53. void find_with_parent(Treap *root, long long key, Treap *&x, Treap *&parent) {
  54.     x = root, parent = NULL;
  55.     while (x != NULL) {
  56.         if (x->key == key) {
  57.             return;
  58.         }
  59.         else if (x->key < key) {
  60.             x = x->right;
  61.         }
  62.         else if (x->key > key) {
  63.             parent = x, x = x->left;
  64.         }
  65.     }
  66. }
  67.  
  68. Treap *find_(Treap *root, long long key) {
  69.     Treap *x, *parent;
  70.     find_with_parent(root, key, x, parent);
  71.     return x;
  72. }
  73.  
  74. bool exists(Treap *root, long long key) {
  75.     return find_(root, key) != NULL;
  76. }
  77.  
  78. bool insert(Treap *&root, long long key) {
  79.     if (exists(root, key)) {
  80.         return false;
  81.     }
  82.     Treap *l = NULL, *r = NULL;
  83.     split(root, key, l, r);
  84.     Treap *x = new Treap(key);
  85.     root = merge_(merge_(l, x), r);
  86.     return true;
  87. }
  88.  
  89. bool delete_(Treap *&root, long long key) {
  90.     if (!exists(root, key)) {
  91.         return false;
  92.     }
  93.     Treap *x = NULL, *parent = NULL;
  94.     find_with_parent(root, key, x, parent);
  95.     if (parent == NULL) {
  96.         root = merge_(x->left, x->right);
  97.     }
  98.     else if (parent->left == x) {
  99.         parent->left = merge_(x->left, x->right);
  100.     }
  101.     else if (parent->right == x) {
  102.         parent->right = merge_(x->left, x->right);
  103.     }
  104.     return true;
  105. }
  106.  
  107.  
  108. int main() {
  109.     Treap *root = NULL;
  110.     string s = "";
  111.     long long number;
  112.     int n;
  113.     cin >> n;
  114.     long long another_number = 0;
  115.     for (int i = 0; i < n; i++){
  116.         cin >> s >> number;
  117.         if (s == "+"){
  118.             number = (number + another_number) % mod;
  119.             insert(root, number);
  120.             another_number = 0;
  121.         }
  122.         else{
  123.             Treap *x;
  124.             Treap *parent;
  125.             find_with_parent(root, number, x, parent);
  126.             if (x == NULL){
  127.                 if (parent == NULL || parent->key < number){
  128.                     another_number = -1;
  129.                 }
  130.                 else{
  131.                     another_number = parent->key;
  132.                 }
  133.             }
  134.             else{
  135.                 another_number = x->key;
  136.             }
  137.             if (x != NULL && parent != NULL && x->key >= number && parent->key >= number){
  138.                 another_number = min(x->key, parent->key);
  139.             }
  140.             cout << another_number << '\n';
  141.             /*
  142.             if (another_number == -1){
  143.                 another_number = 0;
  144.             }
  145.              */
  146.         }
  147.     }
  148.  
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement