Pagini recente » Cod sursa (job #3139528) | Cod sursa (job #1127000) | Cod sursa (job #2630797) | Cod sursa (job #2219955) | Cod sursa (job #2408675)
#include <bits/stdc++.h>
#define INF 1 << 29
using namespace std;
struct treap {
int inf;
int priority;
int minim;
int maxim;
int difMin;
treap * left, * right;
treap () {}
treap (int _inf, int _priority, int _minim, int _maxim, int _difMin, treap * _left, treap * _right) {
inf = _inf;
priority = _priority;
minim = _minim;
maxim = _maxim;
difMin = _difMin;
left = _left;
right = _right;
}
} * r, * nil;
ifstream fin ("zeap.in");
ofstream fout ("zeap.out");
char reader[20];
int numberNodes;
void update (treap * & r) {
r->maxim = max (r->inf, max (r->right->maxim, r->left->maxim));
r->minim = min (r->inf, min (r->right->minim, r->left->minim));
r->difMin = min (r->inf - r->left->maxim, min (r->right->minim - r->inf, min (r->left->difMin, r->right->difMin)));
}
void rotateLeft (treap * & r) {
treap * t = r->right;
r->right = r->left;
t->left = r;
r = t;
update (r->left);
update (r);
}
void rotateRight (treap * & r) {
treap * t = r->left;
r->left = t->right;
t->right = r;
r = t;
update (r->right);
update (r);
}
void balance (treap * & r) {
if (r->left != NULL and r->left->priority > r->priority) {
rotateRight (r);
}
else if (r->right != NULL and r->right->priority > r->priority) {
rotateLeft (r);
}
}
void insertZeap (treap * & r, int inf, int priority) {
if (r == nil) {
r = new treap (inf, priority, inf, inf, INF, nil, nil);
++ numberNodes;
return;
}
if (r->inf == inf) {
return;
}
if (r->inf < inf) {
insertZeap (r->right, inf, priority);
}
else {
insertZeap (r->left, inf, priority);
}
balance (r);
update (r);
}
int eraseZeap (treap * & r, int inf) {
if (r == nil) {
return - 1;
}
if (inf < r->inf) {
return eraseZeap (r->left, inf);
}
else if (inf > r->inf) {
return eraseZeap (r->right, inf);
}
else {
if (r->left == nil and r->right == nil) {
delete r;
-- numberNodes;
r = nil;
}
else {
if (r->left->priority > r->right->priority) {
rotateRight (r);
}
else {
rotateLeft (r);
}
eraseZeap (r, inf);
}
}
if (r != nil) {
update (r);
}
return 0;
}
int findZeap (treap * & r, int inf) {
if (r == nil) {
return 0;
}
if (r->inf == inf) {
return 1;
}
if (r->inf < inf) {
findZeap (r->right, inf);
}
else {
findZeap (r->left, inf);
}
}
int maxDifZeap (treap * & r) {
if (numberNodes < 2) {
return -1;
}
else {
return r->maxim - r->minim;
}
}
int minDifZeap (treap * & r) {
if (numberNodes < 2) {
return -1;
}
else {
return r->difMin;
}
}
int main () {
srand (time (0));
r = nil = new treap (0, 0, INF, - INF, INF, NULL, NULL);
while (fin >> reader) {
if (reader[0] == 'I') {
int x;
fin >> x;
insertZeap (r, x, rand ());
continue;
}
if (reader[0] == 'S') {
int x;
fin >> x;
if (eraseZeap (r, x) == -1) {
fout << -1 << "\n";
}
continue;
}
if (reader[0] == 'C') {
int x;
fin >> x;
fout << findZeap (r, x) << "\n";
continue;
}
if (reader[1] == 'A') {
fout << maxDifZeap (r) << "\n";
}
else {
fout << minDifZeap (r) << "\n";
}
}
return 0;
}