Pagini recente » Cod sursa (job #86161) | Cod sursa (job #1018983) | Cod sursa (job #769536) | Cod sursa (job #2523895) | Cod sursa (job #2133507)
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <cmath>
#define max(a,b) ((a) > (b) ? a : b)
#define geth(n) (n->h =1 + max(n->l->h, n->r->h))
using namespace std;
char s[21];
int nr,a,b, mi, ok;
struct nod
{
int k, h;
nod *l, *r;
}*rad, *nil;
void init()
{
rad = nil = new nod;
nil->r = nil->l = NULL;
nil->k= nil->h = 0;
rad = nil;
}
nod *rotright(nod *n)
{
nod *t = n->l;
n->l = t->r;
t->r = n;
geth(n); geth(t);
return t;
}
nod *rotleft(nod *n)
{
nod *t = n->r;
n->r = t->l;
t->l = n;
geth(n); geth(t);
return t;
}
nod * balance(nod *n)
{
geth(n);
if(n->l->h > n->r->h + 1)
{
if(n->l->l->h < n->l->r->h) n->l = rotleft(n->l);
n = rotright(n);
}
else
if(n->r->h > n->l->h + 1)
{
if(n->r->l->h > n->r->r->h)n->r = rotright(n->r);
n = rotleft(n);
}
return n;
}
nod *insera(nod *n, int k)
{
if(n == nil)
{
nr++;
n = new nod;
n->k = k; n->h = 1;
n->l = n->r = nil;
return n;
}
else if(n->k > k)
{
if(n->k - k < mi){mi = n->k - k; a = k; b = n->k;}
n->l = insera(n->l, k);
}
else
if(n->k < k)
{
if(k - n->k < mi){mi = k - n->k; a = n->k; b = k;}
n->r = insera(n->r, k);
}
else return n;
return balance(n);
}
nod *sterge(nod *n, int k)
{
if(n == nil)
{
printf("-1\n");
return n;
}
if(n->k == k)
{ nr--;
nod *t;
if(n->l == nil || n->r == nil)
{
if(n->l == nil)t=n->r;
else t=n->l;
delete n;
return t;
}
else
{
t = n->r;
for(; t->l!=nil; t=t->l);
n->k = t->k;nr++;
n->r = sterge(n->r,t->k);
return balance(n);
}
}
if(n->k > k)n->l = sterge(n->l, k);
else n->r = sterge(n->r, k);
return balance(n);
}
int caut(nod *n , int k)
{
if(k == n->k)return 1;
if(n == nil) return 0;
if(n->k > k) return caut(n->l, k);
else return caut(n->r, k);
}
int maxi(nod *n)
{
nod *t;
int nrmic;
for(t = n; t->l != nil; t=t->l);
nrmic = t->k;
for(t = n; t->r != nil; t=t->r);
return t->k - nrmic;
}
int t1,t2;
void minima(nod *n)
{
if(n->l != nil)
{
minima(n->l);
}
if(n->k - t1 < mi){mi= n->k - t1;a=n->k;b=t1;}
t1 = n->k;
if(n->r != nil)minima(n->r);
}
int main()
{
int x, i;
FILE *f = fopen("zeap.in", "r");
freopen("zeap.out", "w", stdout);
init();
mi=1<<30;
while(fgets(s,20,f))
{
if(s[0] == 'M')
{
if(s[1] == 'A')
{
if(nr < 2) printf("-1\n");
else printf("%d\n", maxi(rad));
}
else
{
if(nr < 2) printf("-1\n");
else if(ok == 0)printf("%d\n", mi);
else
{
t1=-12345678;
mi=1<<30;
minima(rad);
ok=0;
printf("%d\n", mi);
}
}
}
else
{
x = 0;
i = 2;
while(s[i] >= '0' && s[i] <= '9')x = x*10 +s[i++]-'0';
if(s[0] == 'I')
{
rad = insera(rad, x);
}
else if(s[0] == 'S')
{
if(a == x || b == x)ok = 1;
rad = sterge(rad, x);
}
else if(s[0] == 'C')
{
printf("%d\n", caut(rad, x));
}
}
}
return 0;
}