Cod sursa(job #1849569)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 17 ianuarie 2017 18:04:22
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.29 kb
#include<fstream>
#include<stdlib.h>
#include<time.h>
#define INF 1000000000
using namespace std;
int x, ok, n;
char c[10];
struct nod{
    nod *st, *dr;
    int maxim, minim, dif, val, vp;
    nod(int val, int vp, int maxim, int minim, int dif, nod *st, nod *dr){
        this->maxim = maxim;
        this->minim = minim;
        this->dif = dif;
        this->val = val;
        this->vp = vp;
        this->st = st;
        this->dr = dr;
    }
};
nod *r, *nill;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
void update(nod *r){
    r->maxim = max(r->dr->maxim, r->val);
    r->minim = min(r->st->minim, r->val);
    r->dif = min( min(r->st->dif, r->dr->dif), min(r->val - r->st->maxim, r->dr->minim - r->val ) );
}
void rotst(nod * &r){
    nod *aux = r->st;
    r->st = aux->dr;
    aux->dr = r;
    r = aux;
    update(r->dr);
    update(r);
}
void rotdr(nod * &r){
    nod *aux = r->dr;
    r->dr = aux->st;
    aux->st = r;
    r = aux;
    update(r->st);
    update(r);
}
void gettr(nod * &r){
    if(r->st->vp > r->vp){
        rotst(r);
    }
    else{
        if(r->dr->vp > r->vp){
            rotdr(r);
        }
    }
}
void addtr(nod * &r, int x){
    if(r == nill){
        r = new nod(x, rand() + 1, x, x, INF, nill, nill);
        n++;
    }
    else{
        if(r->val > x){
            addtr(r->st, x);
        }
        else{
            addtr(r->dr, x);
        }
        gettr(r);
        update(r);
    }
}
void deltr(nod * &r, int x){
    if(r != nill){
        if(r->val == x){
            ok = 1;
            if(r->st == nill && r->dr == nill){
                delete r;
                r = nill;
                n--;
            }
            else{
                if(r->st->vp > r->dr->vp){
                    rotst(r);
                }
                else{
                    rotdr(r);
                }
                deltr(r, x);
            }
        }
        else{
            if(r->val > x){
                deltr(r->st, x);
            }
            else{
                deltr(r->dr, x);
            }
        }
        if(r != nill){
            update(r);
        }
    }
}
int srctr(nod *r, int x){
    if(r->val == x){
        return 1;
    }
    if(r == nill){
        return 0;
    }
    if(r->val > x){
        return srctr(r->st, x);
    }
    else{
        return srctr(r->dr, x);
    }
}
int main(){
    srand( time(0));
    r = nill = new nod(0, 0, -INF, INF, INF, NULL, NULL);
    while(fin>> c + 1){
        if(c[1] == 'M'){
            if(n < 2){
                fout<<"-1\n";
                continue;
            }
            if(c[2] == 'A'){
                fout<< r->maxim - r->minim <<"\n";
            }
            else{
                fout<< r->dif <<"\n";
            }
        }
        else{
            fin>> x;
            if(c[1] == 'I'){
                addtr(r, x);
            }
            else{
                if(c[1] == 'S'){
                    ok = 0;
                    deltr(r, x);
                    if(ok == 0){
                        fout<<"-1\n";
                    }
                }
                else{
                    fout<< srctr(r, x) <<"\n";
                }
            }
        }
    }
    return 0;
}