Cod sursa(job #130283)

Utilizator razvi9Jurca Razvan razvi9 Data 31 ianuarie 2008 19:12:13
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include<stdio.h>
struct nod{int x;nod *urmator,*precedent;};
nod *p,*u,*exista,*t,*aux;
char op[50];
int i,j,x,calc,val;

inline void valoare(){
	x=0,j=1;
	while(op[j]==' ') j++;
	while(op[j])
	{x=x*10+op[j]-'0';j++;}}

inline void cauta_poz_adaug()
{if(x<p->x) {t=0;return;}
 if(x>u->x) {t=u;return;}
 if(x==p->x) {t=exista;return;}
 for(t=p;;t=t->urmator){
	 if(t->urmator->x==x) {t=exista;return;}
	 if(t->urmator->x>x)return;}}

inline void insereaza(){
	if(!p){
		p=new nod;
      u=p;
		p->urmator=0;
		p->precedent=0;
		p->x=x;
		calc=0;
		return;}
	cauta_poz_adaug();
	if(t==exista) return;
	aux=new nod;
	aux->x=x;
	if(t&&t!=u){
		if(t->urmator->x-x<val) val=t->urmator->x-x;
		if(t!=p && x-t->precedent->x<val) val=x-t->precedent->x;
		aux->precedent=t;
		aux->urmator=t->urmator;
		t->urmator->precedent=aux;
		t->urmator=aux;
		return;}
	if(t==u){
		if(t!=p && x-t->precedent->x<val) val=x-t->precedent->x;
		aux->precedent=t;
		aux->urmator=0;
		t->urmator=aux;
		u=aux;
		return;}	
	if(t->urmator->x-x<val) val=t->urmator->x-x;
	aux->urmator=p;
	aux->precedent=0;
	p->precedent=aux;
	p=aux;}

inline void cauta_poz(){
	for(t=p;t;t=t->urmator)
		if(t->x==x) return;}

inline void sterge(){
	cauta_poz();
	if(!t){printf("-1\n");return;} 
	if(t==p){
		if(t!=u && t->urmator->x-x==val) calc=0;
		p=p->urmator;
		delete t;
		return;}
	if(t!=u && t->urmator->x-x==val) calc=0;
	if(x-t->precedent->x==val) calc=0;
	aux=t->precedent;
	aux->urmator=t->urmator;
	t->urmator->precedent=aux;
	delete t;}

inline void cauta(){
	cauta_poz();
	if(!t) printf("0\n");
	else printf("1\n");}

inline void max(){
	if(!p || p==u) printf("-1\n");
	else printf("%d\n",u->x-p->x);}

inline void calculeaza_min()
{val=p->urmator->x-p->x;
 for(t=p->urmator;t->urmator;t=t->urmator)
	 if(val>t->urmator->x-t->x) val=t->urmator->x-t->x;}

inline void min(){
	if(!p || p==u) printf("-1\n");
	else
		if(calc) printf("%d\n",val);
		else {
			calculeaza_min();
			calc=1;
			printf("%d\n",val);}}

int main()
{freopen("zeap.in","r",stdin);
 freopen("zeap.out","w",stdout);
 exista=new nod;
 while(!feof(stdin)){
	 gets(op);
	 switch(op[0]){
		 case 'I':{
			 valoare();
			 insereaza();}break;
		 case 'S':{
			 valoare();
			 sterge();}break;
		 case 'C':{
			 valoare();
			 cauta();}break;
		 case 'M':{
			 if(op[1]=='I') {min();}
			 else {max();}break;}
	 }
 }
 fclose(stdout);
 return 0;}