Cod sursa(job #1218139)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 9 august 2014 17:29:12
Problema Hashuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#include<fstream>
using namespace std;

struct cell
{
    int val;
    cell *legst,*legdr;
    cell()
    {
        legst=legdr=NULL;
    }
};

ifstream fin("hashuri.in");
ofstream fout("hashuri.out");

int n,nr;
cell *root,*p,*q,*tata;

inline void ADAUGA(cell *c,int x)
{
    if (x<c->val)
        {
            if (c->legst==NULL)
                {
                    p=new cell;
                    c->legst=p;
                    p->val=x;
                    nr++;
                }
            else ADAUGA(c->legst,x);
        }
    if (x>c->val)
        {

            if (c->legdr==NULL)
                {
                    p=new cell;
                    c->legdr=p;
                    p->val=x;
                    nr++;
                }
            else ADAUGA(c->legdr,x);
        }
}

inline void STERGE(cell *c,int x,int nr)
{
    if (x==c->val)
        {
            cell *t,*tatat;
            p=c->legst;
            q=c->legdr;
            if (!q && !p)
                {
                    if (tata->legdr==c) tata->legdr=NULL;
                    if (tata->legst==c) tata->legst=NULL;
                }
            if (c->legdr!=NULL)
                {
                    tatat=c;
                    t=c->legdr;
                    while (t->legst!=NULL) {tatat=t;t=t->legst;}
                    if (tata->legst->val==x) tata->legst=t;
                    if (tata->legdr->val==x) tata->legdr=t;
                    if (tatat->legdr==t) tatat->legdr=NULL;
                    if (tatat->legst==t) tatat->legst=NULL;
                    t->legst=p;
                    t->legdr=q;
                }
            nr--;
        }
    if (x<c->val && c->legst!=NULL) {tata=c;STERGE(c->legst,x,nr+1);}
    if (x>c->val && c->legdr!=NULL) {tata=c;STERGE(c->legdr,x,nr+1);}
}

inline bool FIND(cell *c,int x)
{
    if (x==c->val) return 1;
    if (x<c->val && c->legst!=NULL) return FIND(c->legst,x);
    if (x>c->val && c->legdr!=NULL) return FIND(c->legdr,x);
    return 0;
}

int main()
{
    int ok,x;
    fin>>n;
    while (n--)
        {
            fin>>ok>>x;
            //fout<<ok<<" "<<x<<"\n";
            if (ok==1)
                {
                    if (nr==0)
                        {nr++;root=new cell;root->val=x;}
                    else ADAUGA(root,x);
                }
            if (ok==2 && nr) STERGE(root,x,0);
            if (ok==3 && nr) fout<<FIND(root,x)<<"\n";
        }
    return 0;
}