Cod sursa(job #1679150)

Utilizator cojocarugabiReality cojocarugabi Data 7 aprilie 2016 18:32:17
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 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)
{
    if (!T)
    {
        Left = Right = 0;
        return ;
    }
    if (T->x <= key)
    {
        if (!T->right) Left = T,Right = 0;
        else
        {
            treap * nw;
            split(T->right,key,nw,Right);
            Left = new treap(T->x,T->y,T->left,nw);
        }
    }
    else
    {
        if (!T->left) Left = 0,Right = T;
        else
        {
            treap *nw;
            split(T->left,key,Left,nw);
            Right = new treap(T->x,T->y,nw,T->right);
        }
    }
}
void del(int val)
{
    treap *l,*r,*m,*aux;
    split(Root,val,aux,r);
    split(aux,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,r,m);
    return (m != 0);
}
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;
}