Pagini recente » Cod sursa (job #94783) | Cod sursa (job #1631508) | Cod sursa (job #1526671) | Cod sursa (job #2547587) | Cod sursa (job #1204285)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("zeap.in");
ofstream o("zeap.out");
struct nod{
nod *st,*dr;
int v,h,def,mx,mn;
nod(){
st=dr=NULL;
def=h=0;
v=-1;
mx=-1;
mn=-1;
}
};
nod *head;
int nr=0,ok,k=0,a[300200],def;
nod *hight(nod *p){
if(p->dr!=0 && p->st!=0){
p->def = p->dr->h-p->st->h;//>0 - mai multi in dreapta , <0 mai multi in stinga
p->h = max(p->dr->h,p->st->h)+1;
p->mn = min(p->v,min(p->st->mn,p->dr->mn));
p->mx = max(p->v,max(p->st->mx,p->dr->mx));
}else if(p->dr!=0 || p->st!=0){
if(p->st==0){
p->def = p->dr->h;
p->h = p->dr->h+1;
p->mn = min(p->v,p->dr->mn);
p->mx = max(p->v,p->dr->mx);
}else{
p->def = -p->st->h;
p->h = p->st->h+1;
p->mn = min(p->v,p->st->mn);
p->mx = max(p->v,p->st->mx);
}
}else{
p->def=p->h=0;
p->mn=p->mx=p->v;
}
return p;
}
nod *right(nod *p){
nod *x = new nod;
x = p->st;
p->st=x->dr;
x->dr = p;
p=hight(p);
x=hight(x);
return x;
}
nod *left(nod *p){
nod *x = new nod;
x = p->dr;
p->dr=x->st;
x->st = p;
p=hight(p);
x=hight(x);
return x;
}
nod *echilibru(nod *p){
p = hight(p);
if(p->def==2){
if( p->dr->def==-1)p->dr = right(p->dr);
p = left(p);
}
if(p->def==-2){
if(p->st->def==1)p->st = left(p->st);
p = right(p);
}
return p;
}
nod *adauga(int x,nod *v){
if(v==NULL){
nod *t = new nod;
t->v=t->mn=t->mx=x;
return t;
}
if(v->v==x){
ok=1;
return v;
}
if(v->v>x){
v->st = adauga(x,v->st);
}
else{
v->dr = adauga(x,v->dr);
}
v = echilibru(v);
return v;
}
void srd(nod *x,int nr){
if(x->st!=NULL)srd(x->st,nr+1);
// o<<x->v<<" h-"<<x->h<<" def-"<<x->def<<" jos-"<<nr<<"\n";
a[++k]=x->v;
if(k>1)def=min(def,a[k]-a[k-1]);
if(x->dr!=NULL)srd(x->dr,nr+1);
}
nod *sterge(int x,nod *p){
if(p==0){ok=1; return 0;}
if(x==p->v){
if(p->st==0 && p->dr==0)return 0;
else if(p->st==0 || p->dr==0){
if(p->st==0)return p->dr;
else return p->st;
}else{
nod *v = new nod;
for(v=p->st;v->dr!=0;v=v->dr);
p->v=v->v;
p->st = sterge(p->v,p->st);
p = echilibru(p);
return p;
}
}else
if(p->v>x) p->st = sterge(x,p->st);
else p->dr = sterge(x,p->dr);
p = echilibru(p);
return p;
}
int cauta(int x,nod *p){
if(p==0)return 0;
if(p->v==x)return 1;
if(p->v>x)return cauta(x,p->st);
return cauta(x,p->dr);
}
int main(){
int n,x;
// f>>n;
head = NULL;
char c,c1,c2;
while(f>>c){
if(c=='I'){
f>>x;ok=0;
head = adauga(x,head);
if(ok==0)nr++;
}else if(c=='S'){
f>>x;ok=0;
head = sterge(x,head);
if(ok==0)nr--;else o<<-1<<"\n";
}else if(c=='C'){
f>>x;
o<<cauta(x,head)<<"\n";
}else{
f>>c1>>c2;
if(c2=='X'){
if(nr>1)o<<head->mx-head->mn<<"\n";else o<<"-1\n";
}else{
k=0;
if(nr>1){
k=0;
def = 1000000000;
srd(head,0);
o<<def<<"\n";
}else o<<"-1\n";
}
}
}
}