Pagini recente » Cod sursa (job #1918) | Cod sursa (job #2758034) | Cod sursa (job #3172869) | Cod sursa (job #2702868) | Cod sursa (job #896329)
Cod sursa(job #896329)
#include<stdio.h>
#include<iostream>
#include<algorithm>
#define Nmax 300002
using namespace std;
int nmin,nmax;
int hmin[Nmax],hmax[Nmax];
void hmin_jos(int x)
{
int fs,fd,k;
do
{
k=0;
fs=x<<1;
fd=fs+1;
if(fs<=nmin)
{
k=fs;
if(fd<=nmin && hmin[fd]<hmin[fs])
k=fd;
if(hmin[k]>=hmin[x])
k=0;
}
if(k)
{
swap(hmin[k],hmin[x]);
x=k;
}
}while(k);
}
void hmin_sus(int x)
{
int t;
t=x>>1;
while(t>=1 && hmin[t]>hmin[x])
{
swap(hmin[t],hmin[x]);
x=t;
t=x>>1;
}
}
int hmin_caut(int p,int x)
{
int y;
if(p>nmin)
return 0;
if(hmin[p]==x)
return p;
if(hmin[p]<x)
{
y=hmin_caut(p<<1,x);
if(y)
return y;
y=hmin_caut((p<<1)+1,x);
return y;
}
return 0;
}
int hmin_add(int x)
{
int y;
y=hmin_caut(1,x);
if(y)
return 1;
++nmin;
hmin[nmin]=x;
hmin_sus(nmin);
return 0;
}
int hmin_del(int x)
{
int y;
if(nmin<=0)
{
printf("-1\n");
return 0;
}
y=hmin_caut(1,x);
if(y==0)
{
printf("-1\n");
return 0;
}
hmin[y]=hmin[nmin];
--nmin;
hmin_jos(y);
return 1;
}
void hmax_jos(int x)
{
int fs,fd,k;
do
{
k=0;
fs=x<<1;
fd=fs+1;
if(fs<=nmax)
{
k=fs;
if(fd<=nmax && hmax[fd]>hmax[fs])
k=fd;
if(hmax[k]<=hmax[x])
k=0;
}
if(k)
{
swap(hmax[k],hmax[x]);
x=k;
}
}while(k);
}
void hmax_sus(int x)
{
int t;
t=x>>1;
while(t>=1 && hmax[t]<hmax[x])
{
swap(hmax[t],hmax[x]);
x=t;
t=x>>1;
}
}
void hmax_add(int x)
{
++nmax;
hmax[nmax]=x;
hmax_sus(nmax);
}
int hmax_caut(int p,int x)
{
int y;
if(p>nmax)
return 0;
if(hmax[p]==x)
return p;
if(hmax[p]>x)
{
y=hmax_caut(p<<1,x);
if(y)
return y;
y=hmax_caut((p<<1)+1,x);
return y;
}
return 0;
}
void hmax_del(int x)
{
int y;
if(hmax<=0)
return;
y=hmax_caut(1,x);
if(y==0)
return;
hmax[y]=hmax[nmax];
--nmax;
hmax_jos(y);
}
void rezolv()
{
char s[50];
int x,i,y;
while(fgets(s,50,stdin))
{
if(s[0]=='M')
{
if(nmin<2)
{
printf("-1\n");
continue;
}
if(s[1]=='A')
printf("%d\n",hmax[1]-hmin[1]);
else
printf("%d\n",min(hmin[2],hmin[3])-hmin[1]);
}
else
{
x=0;
for(i=2;s[i]!='\n'&&s[i]!=0;++i)
x=x*10+s[i]-'0';
if(s[0]=='I')
{
y=hmin_add(x);
if(y==0)
hmax_add(x);
continue;
}
if(s[0]=='C')
{
y=hmin_caut(1,x);
if(y==0)
printf("0\n");
else
printf("1\n");
continue;
}
y=hmin_del(x);
if(y==1)
hmax_del(x);
}
}
}
int main()
{
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
rezolv();
fclose(stdin);
fclose(stdout);
return 0;
}