Cod sursa(job #2897141)

Utilizator mirceaspPetcu Mircea mirceasp Data 2 mai 2022 16:35:05
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.84 kb
#include<iostream>
#include <fstream>
#include <string>
#include <memory>
#include <utility>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("muzica.in");
ofstream g("muzica.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()
{

    long long n,s,i,x;
    string comanda;
    while (!f.eof())
    {
//        afisare(radacina);
//        g<<'\n';
        f>>comanda;
        if(comanda.size()<3) {
            f >> x;
          if(comanda == "I")
          {
              insereaza(radacina,x);
                }
           else if(comanda == "S")
                {
                   int y = sterge(radacina,x);
                   if(y == -1)
                    g<<-1<<'\n';
                }
           else if(comanda == "C")
                {
                    g<<cauta(radacina,x)<<'\n';
                }

            }
        else{
          if(comanda == "MAX") {
              g << max_dif() << '\n';
              diferente.clear();
          }
          else if(comanda == "MIN") {
              g << min_dif() << '\n';
              diferente.clear();
          }
        }

    }
    f.close();g.close();
    return 0;
}