Cod sursa(job #2133269)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 16 februarie 2018 18:45:37
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.5 kb
#include <iostream>
#include <cstdio>
#include <math.h>
using namespace std;
#define m 131072
#define max(a, b) ((a) > (b) ? (a):(b))
#define geth(n) (n->h = 1 + max(n->l->h, n->r->h))
FILE *f = fopen("zeap.in", "rt");
FILE *g = fopen("zeap.out", "wt");
int MI;
struct nod
{
    int key, dif, h;
    nod *l, *r;
}*rad,*nil;
void init()
{
    nil = rad = new nod;
    nil->dif = nil->h = nil->key = 0;
    nil->l = nil->r = NULL;
    rad = nil;
}

nod *rotright(nod *n)
{
    n->h = geth(n);
    nod *t = n->l;
    n->l = t->r;
    t->r = n;
    geth(n); geth(t);
    return t;
}

 nod *rotleft(nod *n)
 {
     n->h = geth(n);
     nod *t = n->r;
     n->r = t->l;
     t-> l = n;
     geth(n); geth(t);
     return t;
}
int q,b;
void mini(nod *n)
{
    if(n->l != nil)
        {
            mini(n->l);
        }

        if(b > fabs(n->key - q))b=fabs(n->key - q);

        q = n->key;
        if(n->r !=  nil)
            mini(n->r);



}

int maxim(nod *n)
{
    nod *t;
    int a,b;
    if(rad->l==nil && rad->r == nil)return -1;
    t=n;
    for(t;t->l!=nil;t=t->l);
    a=t->key;
    for(t=n;t->r!=nil;t=t->r);
    b=t->key;
    return b-a;
}
void minim(nod *n)
{
    if((n->l != nil || n->r != nil )&& n->dif < MI)MI = n->dif;
    if(n->l != nil)minim(n->l);
    if(n->r!=nil)minim(n->r);
}
int calcdif(nod *n)
{
    nod *t;
    if(n->l != nil)
        {
    for(t=n->l;t->r != nil; t = t->r);
    if(n->dif > n->key - t->key) n->dif = n->key - t->key;
        }
        if(n->r != nil)
        {
    for(t = n->r; t->l != nil; t = t->l);
    if(n->dif > t->key - n->key)n->dif = t->key - n->key;
        }
    return n->dif;
}
nod *balance(nod *n)
{
    n->h = geth(n);
    if(n->l->h > n->r->h + 1)
    {
        if(n->l->r->h > n->l->l->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);
    }
   // n->dif = 1<<30;
  //  n->dif = calcdif(n);
    return n;
}
nod *inser(nod *n, int k)
{
    if(n == nil)
    {
        n = new nod;
        n->key = k;
        n->h = 1;
        n->l = n->r = nil;
       // n->dif = 1<<30;
        return n;
    }
    if(n->key > k)
        n->l = inser(n->l, k);
    else n->r = inser(n->r, k);
    return balance(n);
}

nod *sterg(nod *n, int k)
{
    if(n == nil) {fprintf(g, "-1\n");return n;}
    nod *t;
    if(n->key == k)
    {
        if(n->l == nil || n->r == nil)
        {//maybe not
            if(n->l == nil)t=n->r;
            else t=n->l;
            delete n;
            return t;
        }
        else
        {
            for(t = n->r; t->l != nil; t=t->l);
            n->key = t->key;
            n->r = sterg(n->r, t->key);
            return balance(n);
        }
    }
    else if(n->key > k)n->l = sterg(n->l, k);
    else n->r = sterg(n->r, k);
    balance (n);
}
int caut(nod *n, int k)
{
    if(n == nil)return 0;
    if(n->key == k)return 1;
    if(n->key > k)return caut(n->l, k);
    else return caut(n->r, k);
}

char buff[m+14];
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;
}

int main()
{
    int x;
buff[fread(buff, 1, m, f)] = 0;


init();
/*
rad = inser(rad,1);
rad=inser(rad,3);
 rad = sterg(rad, 2);
rad=inser(rad,7);
 rad = sterg(rad, 3);
*/
//rad=inser(rad,2);
//rad=inser(rad,1);
//rad=inser(rad,3);
//rad=inser(rad,6);
//rad=sterg(rad,5);



while(buff[c]&&buff[c]!='\n')
{
    if(buff[c] == 'I')
    {
    x = pars();
    //rad = inser(rad, x);
   // printf("%d\n",x);
    }
    else if(buff[c] == 'S')
    {
        x = pars();
      // rad = sterg(rad, x);
   // printf("%d\n",x);

    }
    else if(buff[c] == 'C')
    {
     x = pars();
    // fprintf(g, "%d\n", caut(rad, x));
   // printf("%d\n",x);
    }
        else if(buff[c+1] == 'A')
    {
      //  fprintf(g,"%d\n", maxim(rad));
    c+=4;
    if(c >=m){buff[fread(buff, 1, m, f)] =0;c=c-m;}
    }
    else
    {

    if(rad->l==nil && rad->r == nil)fprintf(g,"-1\n");
    else
    {
    b = q = 1<<30;
    //mini(rad);
    fprintf(g, "%d\n", b);
    }
    c+=4;if(c >=m){buff[fread(buff, 1, m, f)] = 0;c=c-m;}
    }
}


    return 0;
}