Pagini recente » Cod sursa (job #1930362) | Cod sursa (job #1427262) | Cod sursa (job #1298925) | Cod sursa (job #717432) | Cod sursa (job #329259)
Cod sursa(job #329259)
# include <cstdio>
# include <time.h>
# include <stdlib.h>
# include <string.h>
using namespace std;
# define FIN "zeap.in"
# define FOUT "zeap.out"
# define min(a, b) (a < b ? a : b)
# define MAX_L 5
# define inf 0x3f3f3f3f
struct lista
{
lista *st, *dr;
int val, prt, min, max, mind;
} *Z, *p;
int val;
char s[MAX_L];
void update(lista *&nod)
{
nod -> mind = inf;
nod -> min = nod -> max = nod -> val;
if (nod -> st != NULL)
{
nod -> min = nod -> st -> min;
nod -> mind = min(nod -> mind, nod -> st -> mind);
nod -> mind = min(nod -> mind, nod -> val - nod -> st -> max);
}
if (nod -> dr != NULL)
{
nod -> max = nod -> dr -> max;
nod -> mind = min(nod -> mind, nod -> dr -> mind);
nod -> mind = min(nod -> mind, nod -> dr -> min - nod -> val);
}
}
void rotst(lista *&f)
{
p = f -> st; f -> st = p -> dr; p -> dr = f; f = p;
}
void rotdr(lista *&f)
{
p = f -> dr; f -> dr = p -> st; p -> st = f; f = p;
}
void balance(lista *&f)
{
if (f -> st != NULL)
if (f -> st -> prt > f -> prt)
{
rotst(f);
update(f -> dr);
}
if (f -> dr != NULL)
if (f -> dr -> prt > f -> prt)
{
rotdr(f);
update(f -> st);
}
update(f);
}
void Insert(lista *&f, int val)
{
lista *p;
if (f == NULL)
{
p = new lista;
p -> st = p -> dr = NULL;
p -> mind = inf; p -> prt = rand();
p -> val = p -> min = p -> max = val;
f = p;
return;
}
if (val == f -> val) return;
if (val < f -> val) Insert(f -> st, val);
else Insert(f -> dr, val);
balance(f);
}
int Search(lista *f, int val)
{
if (f == NULL) return 0;
if (f -> val == val) return 1;
if (val < f -> val) return Search(f -> st, val);
else return Search(f -> dr, val);
}
void Delete(lista *&f, int val)
{
if (f == NULL)
{
printf("-1\n");
return;
}
if (val < f -> val) Delete(f -> st, val);
if (val > f -> val) Delete(f -> dr, val);
if (val == f -> val)
{
if (f -> st == NULL && f -> dr == NULL)
{
delete f;
f = NULL;
return;
}
if (f -> st == NULL) rotdr(f);
else if (f -> dr == NULL) rotst(f);
else if (f -> st -> prt > f -> dr -> prt) rotst(f);
else rotdr(f);
Delete(f, val);
}
update(f);
}
int main()
{
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
Z = NULL;
srand(time(NULL));
for (; scanf("%s", s + 1) != EOF; )
{
if (s[1] == 'I')
{
scanf("%d", &val);
Insert(Z, val);
continue;
}
if (s[1] == 'S')
{
scanf("%d", &val);
Delete(Z, val);
continue;
}
if (s[1] == 'C')
{
scanf("%d", &val);
printf("%d\n", Search(Z, val));
continue;
}
if (s[1] == 'M' && s[2] == 'A')
{
if (Z -> max != Z -> min) printf("%d\n", Z -> max - Z -> min);
else printf("-1\n");
continue;
}
if (Z -> mind != inf) printf("%d\n", Z -> mind);
else printf("-1\n");
}
return 0;
}