Pagini recente » Cod sursa (job #2468083) | Monitorul de evaluare | Cod sursa (job #2323791) | Cod sursa (job #1798668) | Cod sursa (job #2543405)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("zeap.in");
ofstream fo("zeap.out");
struct Treap {
int val, priority;
Treap *left, *right;
Treap(int val, int priority, Treap *left, Treap *right) {
this->val = val;
this->priority = priority;
this->left = left;
this->right = right;
}
} *T, *nil;
char A[50];
int getRandom() {
return rand() % 10000 * 10000 + rand() % 10000;
}
void rotToRight(Treap *&nod) {
Treap *t = nod->left;
nod->left = t->right; t->right = nod;
nod = t;
}
void rotToLeft(Treap *&nod) {
Treap *t = nod->right;
nod->right = t->left; t->left = nod;
nod = t;
}
void balans(Treap *&nod) {
if (nod == nil)
return;
if (nod->left->priority > nod->priority)
rotToRight(nod);
else if (nod->right->priority > nod->priority)
rotToLeft(nod);
}
void baga(Treap *&nod, int val) {
if (nod == nil) {
nod = new Treap(val, getRandom(), nil, nil);
return;
}
if (val < nod->val) {
baga(nod->left, val);
}
else if (val > nod->val) {
baga(nod->right, val);
}
balans(nod);
}
void scoate(Treap *&nod, int val) {
if (nod == nil)
return;
if (nod->val == val) {
if (nod->left == nil && nod->right == nil) {
delete nod;
nod = nil;
}
else if (nod->left->priority > nod->right->priority) {
rotToRight(nod);
}
else {
rotToLeft(nod);
}
scoate(nod, val);
}
else {
if (val <= nod->val)
scoate(nod->left, val);
else
scoate(nod->right, val);
}
}
bool cauta(Treap *nod, int val) {
if (nod == nil)
return 0;
if (nod->val == val)
return 1;
else if (val < nod->val)
return cauta(nod->left, val);
else
return cauta(nod->right, val);
}
int getMax(Treap *nod) {
if (nod->right != nil)
return getMax(nod->right);
else
return nod->val;
}
int getMin(Treap *nod) {
if (nod->left != nil)
return getMin(nod->left);
else
return nod->val;
}
bool amDoua() {
if (T == nil)
return 0;
return T->left != nil || T->right != nil;
}
int main()
{
T = nil = new Treap(0, 0, NULL, NULL);
while (fi.getline(A + 1, 100)) {
if (A[1] != 'M') {
int x = 0;
for (int i = 3; i <= strlen(A + 1); i++)
x = x * 10 + (A[i] - '0');
if (A[1] == 'I') {
baga(T, x);
}
else if (A[1] == 'S') {
if (cauta(T, x) == 0)
fo << -1 << "\n";
else
scoate(T, x);
}
else {
fo << cauta(T, x) << "\n";
}
}
else {
if (!amDoua()) {
fo << -1 << "\n";
}
if (A[2] == 'A') {
//diferenta maxima
fo << getMax(T) - getMin(T) << "\n";
}
else {
// diferenta minima
}
}
}
return 0;
}