Advertisement
nq1s788

Untitled

Jun 1st, 2024
670
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <random>
  7. #include <stack>
  8. #include <queue>
  9. #include <string>
  10. #include <tuple>
  11. #include <set>
  12. #include <numeric>
  13. #include <list>
  14. #include <iomanip>
  15. #include <cassert>
  16. #include <array>
  17. #include <unordered_map>
  18. #include <bitset>
  19. #include <ctime>
  20. #include <chrono>
  21.  
  22. using namespace std;
  23.  
  24.  
  25.  
  26.  
  27. struct node {
  28.     long long x, y, s;
  29.     node* l, * r;
  30. };
  31. vector<node>memory(16*1024*1024/sizeof(node));
  32. long long c = 0;
  33. node* new_node() {
  34.     return &memory[c++];
  35. }
  36.  
  37. long long size(node* a) {
  38.     if (a == NULL) {
  39.         return 0;
  40.     }
  41.     return a->s;
  42. }
  43.  
  44. node* merge(node* r, node* l) {
  45.     if (r == NULL or l == NULL) {
  46.         return max(l, r);
  47.     }
  48.     if (r->y > l->y) {
  49.         r->l = merge(l, r->l);
  50.         r->s = size(r->l) + size(r->r);
  51.         return r;
  52.     }
  53.     l->r = merge(l->r, r);
  54.     l->s = size(l->l) + size(l->r);
  55.     return l;
  56. }
  57.  
  58. array<node*, 2> split(node* s, long long x) {
  59.     if (s == NULL) {
  60.         return { NULL, NULL };
  61.     }
  62.     if (s->x < x) {
  63.         auto q = split(s->r, x);
  64.         s->r = q[0];
  65.         s->s = size(s->l) + size(s->r);
  66.         return { s, q[1] };
  67.     }
  68.     auto q = split(s->l, x);
  69.     s->l = q[1];
  70.     s->s = size(s->l) + size(s->r);
  71.     return { q[0], s };
  72. }
  73.  
  74.  
  75. node* kmin(node* s, long long k) {
  76.     if (s == NULL) { return s; };
  77.     if (k <= size(s->l)) {
  78.         return kmin(s->l, k);
  79.     }
  80.     k -= size(s->l);
  81.     if (k == 1) {
  82.         return s;
  83.     }
  84.     return kmin(s->r, k - 1);
  85. }
  86.  
  87. bool cmp(node* a, node* b) {
  88.     return a->x < b->x;
  89. }
  90.  
  91.  
  92. node* add(node* s, long long x, long long y) {
  93.     node* q = new_node();
  94.     q->x = x; q->y = y;
  95.     auto qwe = split(s, x);
  96.     return merge(merge(qwe[0], q), qwe[1]);
  97. }
  98.  
  99. void print(node* s) {
  100.     if (s == NULL) return;
  101.     print(s -> l);
  102.     cout << s -> x << ' ';
  103.     print(s -> r);
  104. }
  105.  
  106.  
  107. int main() {
  108.     srand(time(0));
  109.     ios_base::sync_with_stdio(false);
  110.     cin.tie(0);
  111.     long long n;
  112.     cin >> n;
  113.     node* s = NULL;
  114.     long long c1 = 0;
  115.     for (long long i = 0; i < n; i++) {
  116.         char q; long long j;
  117.         cin >> q >> j;
  118.         if (q == '+') {
  119.             s = add(s, (j+c1 + 1000000000)%(1000000000), (long long)rand());
  120.             print(s);
  121.             cout << '\n';
  122.             c1 = 0;
  123.         }
  124.         else {
  125.             auto q = split(s, j);
  126.             if (q[1] == NULL) {
  127.                 cout << "-1\n";
  128.                 c1 = -1;
  129.             }
  130.             else {
  131.                 auto qweqwe = kmin(q[1], 1);
  132.                 cout << qweqwe->x << "\n";
  133.                 c1 = qweqwe->x;
  134.             }
  135.             s = merge(q[0], q[1]);
  136.         }
  137.     }
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement