Pagini recente » Cod sursa (job #3280564) | Cod sursa (job #2901263) | Cod sursa (job #2904504) | Istoria paginii runda/viata_periculoasa_pe_infoarena2 | Cod sursa (job #2897729)
#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 (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;
}
}
void sterge(nod * &r, long long x)
{
if (r->val == x) {
if (r->st == nullptr && r->dr == nullptr) {
delete r;
r = nullptr;
} else if (r->st != nullptr && r->dr == nullptr) {
nod * temp = r;
r = r->st;
delete temp;
} else if (r->dr != nullptr && r->st == 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] != 'M') {
long long x = 0;
long long p = 1;
for(long long i = 2; (int)s[i]>47 && (int)s[i]<58;i++) { x += ((int)s[i]-48) *p;p*=10;}
long long copie = x;
x = 0;
while (copie)
{
x += copie%10;
copie /=10;
}
if (s[0] == 'I') {
if (cauta(radacina, x) == 0)
insereaza(radacina, x);
}
else if (s[0] == 'S') {
if (cauta(radacina, x) == 1)
sterge(radacina, x);
else
g<<-1<<'\n';}
else if (s[0] == 'C')
g << cauta(radacina,x ) << '\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;
}