Cod sursa(job #2897699)

Utilizator mirceaspPetcu Mircea mirceasp Data 4 mai 2022 16:04:10
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.71 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
ofstream g("zeap.out");
vector <long long >diferente;
struct nod{
    long long val;
    nod *st, *dr;
};
nod *radacina = nullptr;
void afisare(nod *r)
{
    if(r)
    {
        afisare(r->st);
        g<<r->val<<' ';
        afisare(r->dr);

    }
}
void parcurgere(nod * r,long long &lungime)
{
    if(r != nullptr)
    {
        parcurgere(r->st,lungime);
        lungime++;
        diferente.push_back(r->val);
        parcurgere(r->dr,lungime);
    }
}
long long max_dif() {
    long long l = 0;
    parcurgere(::radacina, l);
    if (l < 2)
        return -1;
    else {
        sort(diferente.begin(),diferente.end());
        return abs(diferente[diferente.size()-1] - diferente[0]);
    }

}
long long min_dif() {
    long long l = 0;
    parcurgere(::radacina,l);
    if(l<2)
        return -1;
    else
    {
        sort(diferente.begin(),diferente.end());
        long long minim = 10e9 +3;
        for(long long i = 0;i<diferente.size()-1;i++)
            if(abs(diferente[i] - diferente[i+1])< minim)
                minim = abs(diferente[i] - diferente[i+1]);
        return minim;
    }
}
int cauta(nod * r,long long x)
{
    if(r == nullptr)
        return 0;
    else if(x == r->val)
        return 1;
    else if(x<r->val)
        cauta(r->st,x);
    else if(x>r->val)
        cauta(r->dr,x);
}
void insereaza(nod * &r, long long x)
{
    if(cauta(r,x) == 1)
        return;
    else {
        if (r == nullptr) {
            r = new nod;
            r->val = x;
            r->st = nullptr;
            r->dr = nullptr;
        } else if(x<r->val)
            insereaza(r->st,x);
        else if(x>r->val)
            insereaza(r->dr,x);
    }
}
void stergere_cu_2_fii(nod * &r,nod*& desters)
{
    if(r->dr != nullptr)
        stergere_cu_2_fii(r->dr,desters);
    else {
        desters->val = r->val;
        nod *temp = r;
        r = r->st;
        delete temp;
    }
}

int sterge(nod * &r, long long x)
{
    if(cauta(r,x) == 0)
        return -1;
    else {
        if (r->val == x) {
            if (r->st == nullptr && r->dr == nullptr) {
                delete r;
                r = nullptr;
            } else if (r->st != nullptr) {
                nod * temp = r;
                r = r->st;
                delete temp;
            } else if (r->dr != nullptr) {
                nod * temp = r;
                r = r->dr;
                delete temp;
            }
            else if(r->dr != nullptr && r->st != nullptr)
            {
                stergere_cu_2_fii(r->st,r);
            }
        } else if (x < r->val)
            sterge(r->st, x);
        else
            sterge(r->dr, x);
    }
}
int main()
{
    FILE *pFile;
    char s[100];
    pFile = fopen("zeap.in","r");
    if(pFile == NULL) perror("Error opening file");
    else
    {
        while (fgets(s, 100, pFile) != NULL) {
            if(s[0] == 'I')
                insereaza(radacina,(int)s[2]);
            else if(s[0] == 'S')
                try{
                   int y = sterge(radacina,(int)s[2]);
                    if(y == -1) throw y;
                }
                catch (...) {
                    g<<-1<<'\n';
                }
            else if (s[0] == 'C')
                g<<cauta(radacina,(int)s[2])<<'\n';
            else if(s[0] == 'M' && s[1] == 'A') { g << max_dif() << '\n'; diferente.clear(); }
            else if(s[0] == 'M' && s[1] == 'I') { g << min_dif() << '\n'; diferente.clear();}
            }

    }
    fclose(pFile);
    return 0;
}