Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int mod = 1e9;
- struct Node{
- Node *left, *right;
- int y = rand(), x;
- };
- vector<Node> tree(200000);
- int POS = 0;
- void split(Node *treap, Node *&left, Node *&right, int x){
- if (treap == NULL){
- left = right = NULL;
- return;
- }
- if (treap->x < x){
- left = treap;
- split(treap->right, treap->right, right, x);
- }
- else{
- right = treap;
- split(treap->left, left, treap->left, x);
- }
- }
- void merge(Node *&treap, Node *left, Node *right){
- if (left == NULL){
- treap = right;
- return;
- }
- if (right == NULL){
- treap = left;
- return;
- }
- if (left->y > right->y){
- treap = left;
- merge(treap->right, treap->right, right);
- }
- else{
- treap = right;
- merge(treap->left, left, treap->left);
- }
- }
- void out(Node *treap){
- if (treap == NULL)
- return;
- out(treap->left);
- cout << treap->x << " ";
- out(treap->right);
- }
- int get(Node *treap){
- if (treap->left == NULL)
- return treap->x;
- return get(treap->left);
- }
- int main(){
- // freopen("swapper.in", "r", stdin);
- // freopen("swapper.out", "w", stdout);
- cin.tie(0);
- ios_base::sync_with_stdio(false);
- int n, x, prev = 0;
- cin >> n;
- char act;
- Node *treap = NULL;
- Node *left, *right;
- for (int i = 0; i < n; i++){
- cin >> act >> x;
- if (act == '+'){
- x = (x + prev) % mod;
- prev = 0;
- split(treap, left, right, x);
- if (right == NULL || get(right) != x){
- tree[POS].x = x;
- Node *mid = &tree[POS++];
- merge(treap, left, mid);
- merge(treap, treap, right);
- }
- else merge(treap, left, right);
- }
- else{
- split(treap, left, right, x);
- if (right == NULL)
- prev = -1;
- else
- prev = get(right);
- merge(treap, left, right);
- cout << prev << "\n";
- }
- // cout << "i: " << i << endl;
- // out(treap); cout << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement