Pagini recente » Cod sursa (job #1326976) | Cod sursa (job #205925) | Cod sursa (job #1041487) | Cod sursa (job #2402034) | Cod sursa (job #1446966)
#include <stdio.h>
#include <cstring>
#include <bitset>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <stdlib.h>
#include <time.h>
#include <deque>
#define inf 0x3f3f3f3f
#define mod 1000003
using namespace std;
struct node { int key,priority,mini,maxi,difmin; node *left,*right;
node(){
key=0; priority=0; mini=0; mini=inf; maxi=-inf; difmin=inf; left=NULL; right=NULL;
}
};
int x,minn,y,nr; bool ok;
char ss[16];
string s;
node *root,*nil;
inline void update(node *&a)
{
a->mini=min(a->key,a->left->mini);
a->maxi=max(a->key,a->right->maxi);
a->difmin=min(min(a->left->difmin,a->right->difmin),min(a->key-a->left->maxi,a->right->mini-a->key));
}
inline void rotleft(node* &a)
{
node *aux=a->left;
a->left=aux->right; aux->right=a;
a=aux;
if (a!=nil && a->right!=nil) update(a->right);
}
inline void rotright(node* &a)
{
node *aux=a->right;
a->right=aux->left; aux->left=a;
a=aux;
if (a!=nil && a->left!=nil) update(a->left);
}
void balance(node* &a)
{
if (a->left->priority>a->priority) rotleft(a); else
if (a->right->priority>a->priority) rotright(a);
update(a);
}
inline void insert(node* &a,int key,int priority)
{
if (a==nil){
a=new node; a->key=key; a->priority=priority; a->mini=key; a->maxi=key;
a->left=nil; a->right=nil; y++;
return;
}
if (key==a->key) return;
if (key<a->key) insert(a->left,key,priority); else
insert(a->right,key,priority);
balance(a);
}
inline int find(node *a,int key)
{
if (a==nil) return 0;
if (a->key==key) return 1;
if (key<a->key) return(find(a->left,key)); else
return(find(a->right,key));
}
inline void erase(node* &a,int key)
{
if (a==nil) return;
if (key<a->key) erase(a->left,key); else
if (key>a->key) erase(a->right,key); else
{
if (a->left==nil && a->right==nil) { delete(a); y--; ok=true; a=nil; return; }
if (a->left->priority>a->right->priority) rotleft(a); else
rotright(a);
erase(a,key);
}
if (a!=nil) update(a);
}
inline int dif(node* a)
{
if (y>=2) return(a->maxi-a->mini); else
return (-1);
}
int main(){
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
srand(time(0));
nil=new node; root=nil; nr=0; y=0;
while (!feof(stdin)){
scanf("%s",ss); s=ss;
if (s=="MIN") {
if (y>=2) printf("%d\n",root->difmin); else printf("-1\n");
} else
if (s=="MAX") printf("%d\n",dif(root)); else
if (s=="I") { scanf("%d",&x); nr++; insert(root,x,rand()); } else
if (s=="S") { scanf("%d",&x); ok=false; erase(root,x);
if (!ok) printf("-1\n");
} else
if (s=="C") { scanf("%d",&x); printf("%d\n",find(root,x)); }
scanf("\n");
}
return 0;
}