Cod sursa(job #654383)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 30 decembrie 2011 13:37:45
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>

#define file_in "heapuri.in"
#define file_out "heapuri.out"


struct nod{
	
	int val;
	nod *st, *dr;
};

nod * v;

int T,tip,val;
int nr,cnt[301000];

void inserare(nod *& c, int val){
	
	if (c){
		if (c->val>val)
			inserare(c->st,val);
		else
			inserare(c->dr,val);
	}
	else{
		c=new nod;
		c->val=val;
		c->st=c->dr=0;
	}
}

void doit(nod *&c, nod *& a){
while(a->dr)
	doit(c,a->dr);
                nod * r;
		        c->val=a->val;
	 	        r=a;
		        a=a->st;
		        delete r;
}				


void stergere(nod *& c, int x){
	
	nod * a;
	
	if (c){
		if (c->val==x)
			if (c->st==0 && c->dr==0){
				delete c;
				c=0;
			}
			else
			if (c->st==0){
                a=c->dr;
                delete c;
                c=a;
			}
			else
			if (c->dr==0){
                a=c->st;
                delete c;
                c=a;
			}	
			else{
				doit(c,c->st);
	            }
				
			else
		if (c->val<x)
            stergere(c->dr,x);
		else
			stergere(c->st,x);
	}
	else
		return ;
}

int min(nod * c){
	
	while(c->st)
		c=c->st;
	return c->val;
}

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &T);
	nr=0;
	while(T--){
		
		scanf("%d", &tip);
		
		if (tip==1){
			
			scanf("%d", &val);
			cnt[++nr]=val;
			inserare(v,val);
		}
		else
		if (tip==2){
			scanf("%d", &val);
			stergere(v,cnt[val]);
		}
		else
			printf("%d\n", min(v));
	}
	
	return 0;
}