Cod sursa(job #1679254)

Utilizator cojocarugabiReality cojocarugabi Data 7 aprilie 2016 20:01:09
Problema Hashuri Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
# include <bits/stdc++.h>
using namespace std;
struct treap
{
    int x,y;
    treap * left, *right;
    treap(int x,int y,treap * left,treap * right) : x(x),y(y),left(left),right(right) {}
    treap() : x(0),y(0),left(0),right(0) {}
};
int cnt = 0;
treap * Root = new treap(0,0,0,0);
treap * Merge(treap * a,treap * b)
{
    if (!a) return b;
    if (!b) return a;
    if (a->y > b->y) return new treap(a->x,a->y,a->left,Merge(a->right,b));
    else return new treap(b->x,b->y,Merge(a,b->left),b->right);
}
void print(treap * T)
{
    if (!T) return;
    cerr << T->x << ' ';
    if (T->left) print(T->left);
    if (T->right) print(T->right);
}
void split(treap * T,int key,treap * &Left,treap * &Right)
{
    Left = Right = 0;
    if (!T) return;
    if (T->x <= key)
    {
        split(T->right,key,T->right,Right);
        Left = T;
    }
    else
    {
        split(T->left,key,Left,T->left);
        Right = T;
    }
}
void del(int val)
{
    treap *l,*r,*m;
    split(Root,val,l,r);
    split(l,val-1,l,m);
    Root = Merge(l,r);
}
void add(int val)
{
    treap *l,*r;
    split(Root,val,l,r);
    treap * m = new treap(val,rand() + 1,0,0);
    Root = Merge(Merge(l,m),r);
}
int ok(int val)
{
    treap *l,*r,*m;
    split(Root,val,l,r);
    split(l,val-1,l,m);
    bool ok = (m != 0);
    Root = Merge(Merge(l,m),r);
    return ok;
}
int main(void)
{
    srand(time(0));
    int n;
    ifstream fi("hashuri.in");
    ofstream fo("hashuri.out");
    ios_base :: sync_with_stdio(0);
    fi>>n;
    while (n --)
    {
        int op,val;
        fi>>op>>val;
        if (op == 1) add(val);
        else
        if (op == 2) del(val);
        else fo << ok(val) << '\n';
    }
    return 0;
}