Pagini recente » Cod sursa (job #1617752) | Cod sursa (job #2016675) | Cod sursa (job #1582969) | Cod sursa (job #2902079) | Cod sursa (job #480140)
Cod sursa(job #480140)
#include<algorithm>
#include<string>
#include<time.h>
using namespace std;
#define INF 1<<30
string I="I";
string S="C";
string D="S";
string MAX="MAX";
string MIN="MIN";
string Op;
char c[30];
struct treap
{
int Min,Max,x,priority,DMin;
treap *St,*Dr;
treap()
{
Min=INF; Max=-INF; DMin=INF;
x=0; priority=0;
St=0; Dr=0;
}
treap(int x,int priority,treap *St,treap *Dr)
{
this->x=x;
this->priority=priority;
this->St=St;
this->Dr=Dr;
this->Min=this->Max=x;
}
};
treap *Rad,*nil;
void init()
{
srand(time(NULL));
Rad=new treap;
nil=Rad;
}
void rotleft(treap *&n)
{
treap *t=n->St;
n->St=t->Dr; t->Dr=n;
n=t;
}
void rotright(treap *&n)
{
treap *t=n->Dr;
n->Dr=t->St; t->St=n;
n=t;
}
void balance(treap *&n)
{
if(n->St->priority>n->priority)
rotleft(n);
else
if(n->Dr->priority>n->priority)
rotright(n);
}
void update(treap *&n)
{
n->Max=max(n->Max,n->Dr->Max);
n->Min=min(n->Min,n->St->Min);
n->DMin=min(min(n->St->DMin,n->Dr->DMin),min(n->x-n->St->Max,n->Dr->Min-n->x));
}
void Insert(treap *&n,int x)
{
if(n->x==x)
return ;
if(n==nil)
{
n=new treap(x,rand()+1,nil,nil);
return ;
}
if(x<n->x)
Insert(n->St,x);
else
Insert(n->Dr,x);
balance(n);
update(n);
}
void Delete(treap *&n,int x)
{
if(n==nil)
{
printf("-1\n");
return ;
}
if(x<n->x)
Delete(n->St,x);
else
if(n->x<x)
Delete(n->Dr,x);
else
{
if(n->St==nil&&n->Dr==nil)
{
delete n; n=nil;
return ;
}
else
{
if(n->St->priority>n->Dr->priority)
rotleft(n);
else
rotright(n);
Delete(n,x);
}
}
balance(n);
update(n);
}
int Search(treap *&n,int x)
{
if(n==nil)
return 0;
if(x<n->x)
return Search(n->St,x);
else
if(n->x<x)
return Search(n->Dr,x);
else
{
return 1;
}
}
int main()
{
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
init();
while(fgets(c,30,stdin))
{
int nr,i;
i=nr=0;
Op.clear();
while('A'<=c[i]&&c[i]<='Z')
{
Op.push_back(c[i]);
i++;
}
while(!('0'<=c[i]&&c[i]<='9'))
i++;
while('0'<=c[i]&&c[i]<='9')
{
nr=nr*10+c[i]-'0';
i++;
}
if(Op==I)
Insert(Rad,nr);
else
if(Op==S)
printf("%d\n",Search(Rad,nr));
else
if(Op==D)
Delete(Rad,nr);
else
if(Rad!=nil&&(Rad->St!=nil||Rad->Dr!=nil))
{
if(Op==MAX)
printf("%d\n",Rad->Max-Rad->Min);
if(Op==MIN)
printf("%d\n",Rad->DMin);
}
else
printf("-1\n");
}
return 0;
}