Pagini recente » Cod sursa (job #2785985) | Cod sursa (job #1913081) | Cod sursa (job #1210654) | Cod sursa (job #2889416) | Cod sursa (job #1201018)
#include<fstream>
#include<algorithm>
#include<string>
using namespace std;
ifstream f("zeap.in");
ofstream o("zeap.out");
struct dat{
int val,h,def,mi,ma;
dat *dr,*st;
dat(){
val=0;
h=def=mi=0;ma=10000000;
dr=st=NULL;
}
};
//typedef dat *lda;
int n,ok,minim;
dat *head;
dat *hight(dat *v){
if(v->dr!=NULL && v->st!=NULL){
v->h = max(v->dr->h,v->st->h)+1;
v->def = v->dr->h - v->st->h;
}else if(v->dr!=NULL || v->st!=NULL){
if(v->dr!=0){
v->h = v->dr->h+1;
v->def = v->dr->h;
}else{
v->h = v->st->h+1;
v->def = -v->st->h;
}
}else{
v->h = 0;
v->def = 0;
}
if(v->st!=0)
v->mi = v->st->val;
else v->mi=v->val;
if(v->dr!=0)
v->ma = v->dr->val;
else v->ma = v->val;
return v;
}
dat *rotleft(dat *v){
dat *x = v->dr;
v->dr = x->st;
x->st = v;
v = hight(v);
x = hight(x);
return x;
}
dat *rotright(dat *v){
dat *x = v->st;
v->st = x->dr;
x->dr = v;
v = hight(v);
x = hight(x);
return x;
}
dat *echilibru(dat *v){
v = hight(v);
if(v->def==2){
if(v->dr->def>=0)v = rotleft(v);
else{
v->dr = rotright(v->dr);
v = rotleft(v);
}
}
if(v->def==-2){
if(v->st->def<=0)v = rotright(v);
else {
v->st = rotleft(v->st);
v = rotright(v);
}
}
return v;
}
dat *adauga(dat *v, int x){
if(v==0){
dat *p = new dat;
p->val = x;
p->mi=x;
p->ma=x;
//v=p;
return p;
}
// if(v->val==x)return v;
//else
if(v->val<=x)v->st = adauga(v->st,x);
else v->dr = adauga(v->dr,x);
/* if(v->st!=0)
v->mi = v->st->val;
else v->mi=0;
if(v->dr!=0)
v->ma = v->dr->val;
else v->ma = 1000000;*/
v = echilibru(v);
/* if(v->st!=0)
v->mi = v->st->val;
else v->mi=0;
if(v->dr!=0)
v->ma = v->dr->val;
else v->ma = 1000000;*/
return v;
}
int cautamax(dat *nod){
// if(nod==0)return 0;
if(nod->st==0)return nod->val;
return cautamax(nod->st);
}
int cautamin(dat *nod){
// if(nod==0)return 0;
if(nod->dr==0)return nod->val;
return cautamin(nod->dr);
}
int cauta(int x,dat *v){
if(v==0)return 0;
if(v->val == x)return 1;
if(v->val<=x) return cauta(x,v->st);
else return cauta(x,v->dr);
}
dat *sterge(int x,dat *v){
if(v==0){ok = 1; return v; }
if(v->val == x){
if(v->dr==NULL && v->st==NULL){
return 0;
}else if(v->dr==NULL || v->st==NULL){
if(v->dr==0)return v->st;
else return v->dr;
}else{
dat *p;
for(p=v->dr;p->st!=NULL;p=p->st);
v->val = p->val;
v->dr = sterge(p->val,v->dr);
return echilibru(v);
}
}
else
if(v->val<=x) v->st = sterge(x,v->st);
else v->dr = sterge(x,v->dr);
//return echilibru(v);
/* if(v->st!=0)
v->mi = v->st->val;
else v->mi=0;
if(v->dr!=0)
v->ma = v->dr->val;
else v->ma = 100000;*/
v = echilibru(v);
/* if(v->st!=0)
v->mi = v->st->val;
else v->mi=0;
if(v->dr!=0)
v->ma = v->dr->val;
else v->ma = 1000000;
*/
return v;
}
int a[10000000],nr=0;
void parcurgere(dat *v){
if(v==0)return;
if(v->dr!=0)parcurgere(v->dr);
a[++nr]=v->val;
// o<<a[nr]<<" ";
if(nr>1) if(nr>1 && a[nr]-a[nr-1]!=0)minim=min(minim,a[nr]-a[nr-1]);
if(v->st!=0)parcurgere(v->st);
}
int main(){
//f>>n;
int x,y;
head= 0;
string s;
while(f>>s){
if(s== "MAX"){ if(head!=0){if(head->st!=0 || head->dr!=0) o<<cautamax(head) - cautamin(head)<<"\n";else o<<"-1\n";}else o<<"-1\n"; }else
if(s== "MIN" ){ nr=0;minim = 100000000;parcurgere(head); o<<(minim!=100000000?minim:-1)<<"\n"; }else
if(s== "I" ){ f>>y;head = adauga(head,y); }else
if(s== "S" ){ f>>y; ok =0; head = sterge(y,head); if(ok)o<<-1<<"\n"; }else
if(s== "C" ){ f>>y; o<<cauta(y,head)<<"\n"; }
}
}