Cod sursa(job #930547)

Utilizator andrettiAndretti Naiden andretti Data 27 martie 2013 18:25:56
Problema Hashuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<stdio.h>
using namespace std;

struct nod{int inf;nod *st,*dr;};
nod *r;
int n;

void insert(nod *&r,int x)
{
    if(r)
    {
        if(x<r->inf) insert(r->st,x);
        else
        if(x>r->inf) insert(r->dr,x);
    }
    else
    {
        r=new nod;
        r->inf=x;
        r->st=0;
        r->dr=0;
    }
}

void del(int x)
{
    nod *p,*t=0 ,*q,*fiu;
    int maxx;

    p=r;
    while(p && p->inf!=x)
    {
        t=p;
        if(x<p->inf) p=p->st;
        else
         p=p->dr;
    }
    if(p==0) return;

    if(p->st && p->dr)
    {
        t=p;
        q=p->st;
        maxx=q->inf;
        while(q->dr) {maxx=q->dr->inf; t=q; q=q->dr;}
        p->inf=maxx;
        p=q;
    }

    if(p->st) fiu=p->st;
    else fiu=p->dr;

    if(t)
    {
        if(t->st==p) t->st=fiu;
        else t->dr=fiu;
    }
    else
     r=fiu;

    delete p;
}

int search(nod *r,int x)
{
    if(r==0) return 0;
    if(r->inf==x) return 1;
    if(x<r->inf) return search(r->st,x);
    if(x>r->inf) return search(r->dr,x);
}

void cit()
{
    int i,ok,x;
    scanf("%d",&n);

    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&ok,&x);

        if(ok==1) insert(r,x);
        else
        if(ok==2) del(x);
        else
           printf("%d\n",search(r,x));
    }
}

int main()
{
    freopen("hashuri.in","r",stdin);
    freopen("hashuri.out","w",stdout);

    cit();

    fclose(stdin);
    fclose(stdout);
    return 0;
}