Cod sursa(job #2133522)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 17 februarie 2018 01:20:22
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.56 kb
#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))
#define M 1048576
char buff[M+14];

using namespace std;
FILE *f = fopen("zeap.in", "r");


int c;
int pars()
{
    c+=2;
    if(c >=M)
    {
        buff[fread(buff, 1, M, f)]=0;
        c=c-M;
    }
    int x=0;
    while('0'<=buff[c]&&'9'>=buff[c])
    {
        x = x*10 + buff[c]-'0';
        c++;
        if(c >=M)
        {
            buff[fread(buff, 1, M, f)]=0;
            c=c-M;
        }
    }
    c++;
    if(c >=M)
    {
        buff[fread(buff, 1, M, f)]=0;
        c=c-M;
    }
    return x;
}




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;

    freopen("zeap.out", "w", stdout);
    init();
    mi=1<<30;
     buff[fread(buff, 1, M, f)] = 0;
/*
    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));
            }
        }

    }


*/


   while(buff[c]&&buff[c]!='\n')
    {
        if(buff[c] == 'I')
        {
            x = pars();
            rad = insera(rad, x);
        }
        else if(buff[c] == 'S')
        {
            x = pars();
           if(a == x || b == x)ok = 1;
               rad = sterge(rad, x);
        }
        else if(buff[c] == 'C')
        {
            x = pars();
            printf("%d\n", caut(rad, x));

        }
        else if(buff[c+1] == 'A')
        {
           if(nr < 2) printf("-1\n");
                else printf("%d\n", maxi(rad));
                 c+=4;
            if(c >=M)
            {
                buff[fread(buff, 1, M, f)] =0;
                c=c-M;
            }
        }
        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);
                }
            c+=4;
            if(c >=M)
            {
                buff[fread(buff, 1, M, f)] = 0;
                c=c-M;
            }
        }
    }

















    return 0;
}