Cod sursa(job #1424597)

Utilizator Kira96Denis Mita Kira96 Data 24 aprilie 2015 23:38:48
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.84 kb
/*
    Look at me!
    Look at me!
    Look at how large the monster inside me has become!
*/

#include<fstream>
#include<cstdio>
#include<map>
#include<set>
#define FIT(a,b) for(vector<int >::iterator a=b.begin();a!=b.end();a++)
#define FITP(a,b) for(vector<pair<int,int> >::iterator a=b.begin();a!=b.end();a++)
#define RIT(a,b) for(vector<int>::reverse_iterator a=b.end();a!=b.begin();++a)
#include<stack>
#define ROF(a,b,c) for(int a=b;a>=c;--a)
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#define REP(a,b) for(register int a=0;a<b;++a)
#include<cstring>
#include<ctime>
#include<bitset>
#include<cmath>
#include<iomanip>
#include<set>
#define f cin
#define g cout
#include<queue>
#define debug cerr<<"OK";
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ld long double
#define ull unsigned long long
#define mod 10067
#define MOD 32416190071
#define N 1000100
#define M 5500010
#define SQR 350
#define inf 1<<30
#define BM 10001000
#define eps 1.e-9
using namespace std;

ifstream f("hashuri.in");
ofstream g("hashuri.out");

int t,x,n;
char s[BM];
int buf;
int nods,L[N],R[N],rad,K[N],pr[N];

void go(int &x)
{
    x=0;
    while(s[buf]>'9'||s[buf]<'0')
        ++buf;
    while(s[buf]<='9'&&s[buf]>='0')
        x=x*10+s[buf++]-'0';
}
void split(int t,int &l,int &r,int k)
{
    if(!t)
    {
        l=r=t;
        return ;
    }
    if(k<=K[t])
        split(L[t],l,L[t],k),r=t;
    else
        split(R[t],R[t],r,k),l=t;
}
void merge(int &t,int l,int r)
{
    if(!l||!r)
    {
        t=l?l:r;
        return ;
    }
    if(pr[l]>pr[r])
        merge(R[l],R[l],r),t=l;
    else
        merge(L[r],l,L[r]),t=r;
}
void insert(int &t,int it)
{
    if(!t)
    {
        t=it;
        rad=t;
        return ;
    }
    if(pr[it]>pr[t])
        split(t,L[it],R[it],K[it]),t=it;
    else
    if(K[it]<K[t])
        insert(L[t],it);
    else
        insert(R[t],it);
    rad=t;
}
void erase(int &t,int k)
{
    if(!t)
        return ;
    if(K[t]==k)
        merge(t,L[t],R[t]);
    else
    if(k<K[t])
        erase(L[t],k);
    else
        erase(R[t],k);
    rad=t;
}
int find(int t,int k)
{
    if(!t)
        return 0;
    if(K[t]==k)
        return 1;
    if(k<K[t])
        return find(L[t],k);
    else
        return find(R[t],k);
}
int main ()
{
    f.get(s,BM,EOF);
    go(n);
    while(n--)
    {
        go(t);go(x);
        if(t==1)
        {
            if(!find(rad,x))
            {
                ++nods;
                K[nods]=x;
                insert(rad,nods);
            }
        }
        else
        if(t==2)
            erase(rad,x);
        else
            g<<find(rad,x)<<"\n";
    }



    return 0;
}