Pagini recente » Cod sursa (job #985208) | Cod sursa (job #1724678) | Cod sursa (job #3173885) | Cod sursa (job #788661) | Cod sursa (job #977078)
Cod sursa(job #977078)
#include<stdio.h>
#include<cstring>
#include<vector>
#define pb push_back
#define mp make_pair
#define v first
#define index second
#define maxn 300005
#define mod 3000013
using namespace std;
struct pair_of_vk{int val,key;} hmin[maxn],hmax[maxn];
int nhmin,nhmax,ind;
int pmin[maxn],pmax[maxn];
vector < pair<int,int> > norm[mod];
char s[20];
int hash_key(int k)
{
return k%mod;
}
int normalize(int val)
{
int k=hash_key(val);
for(unsigned int i=0;i<norm[k].size();i++)
if(norm[k][i].v==val)
return norm[k][i].index;
norm[k].pb(mp(val,++ind));
return ind;
}
void swap_min(int i,int j)
{
pair_of_vk aux;
aux=hmin[i]; hmin[i]=hmin[j]; hmin[j]=aux;
pmin[hmin[i].key]=i;
pmin[hmin[j].key]=j;
}
void swap_max(int i,int j)
{
pair_of_vk aux;
aux=hmax[i]; hmax[i]=hmax[j]; hmax[j]=aux;
pmax[hmax[i].key]=i;
pmax[hmax[j].key]=j;
}
void heap_up_min(int k)
{
if(k<=1) return;
int i=k/2; if(hmin[k].val<hmin[i].val) {swap_min(i,k); heap_up_min(i);}
}
void heap_up_max(int k)
{
if(k<=1) return;
int i=k/2; if(hmax[k].val>hmax[i].val) {swap_max(i,k); heap_up_max(i);}
}
void heap_dw_min(int k)
{
int i=2*k;
if(i<=nhmin)
{
if(i+1<=nhmin && hmin[i+1].val<hmin[i].val) i++;
if(hmin[i].val<hmin[k].val) {swap_min(i,k); heap_dw_min(i);}
}
}
void heap_dw_max(int k)
{
int i=2*k;
if(i<=nhmax)
{
if(i+1<=nhmax && hmax[i+1].val>hmax[i].val) i++;
if(hmax[i].val>hmax[k].val) {swap_max(i,k); heap_dw_max(i);}
}
}
void del_min(int k)
{
int position=pmin[k];
swap_min(position,nhmin--);
pmin[k]=0;
if(position<=nhmin) heap_dw_min(position);
}
void del_max(int k)
{
int position=pmax[k];
swap_max(position,nhmax--);
pmax[k]=0;
if(position<=nhmax) heap_dw_max(position);
}
int number()
{
int nr=0;
for(int i=2;s[i]>='0' && s[i]<='9';i++) nr=nr*10+s[i]-'0';
return nr;
}
void read()
{
int nr,k;
pair_of_vk aux;
while(!feof(stdin))
{
memset(s,'n',sizeof(s));
fgets(s,sizeof(s),stdin);
if(s[2]=='n') return;
if(s[0]=='M')
{
if(s[1]=='A')
{
if(nhmin<2) printf("-1\n");
else printf("%d\n",hmax[1].val-hmin[1].val);
}
else
{
if(nhmin<2) {printf("-1\n"); continue;}
aux=hmin[1]; del_min(hmin[1].key); heap_dw_min(1);
printf("%d\n",hmin[1].val-aux.val);
hmin[++nhmin]=aux; pmin[aux.key]=nhmin; heap_up_min(nhmin);
}
}
else
{
nr=number();
k=normalize(nr);
//printf("%d %d\n",nr,k);
if(s[0]=='I')
{
if(pmin[k]) continue;
aux.val=nr; aux.key=k;
hmin[++nhmin]=aux; pmin[k]=nhmin; heap_up_min(nhmin);
hmax[++nhmax]=aux; pmax[k]=nhmax; heap_up_max(nhmax);
}
else
if(s[0]=='S')
{
if(!pmin[k]) printf("-1\n");
else del_min(k),del_max(k);
}
else
{
if(!pmin[k]) printf("0\n");
else printf("1\n");
}
}
scanf("\n");
}
}
int main()
{
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
read();
fclose(stdin);
fclose(stdout);
return 0;
}