Pagini recente » Borderou de evaluare (job #102446) | Borderou de evaluare (job #3143344) | Borderou de evaluare (job #1751720) | Borderou de evaluare (job #384120) | Cod sursa (job #3315744)
#include <bits/stdc++.h>
#define int long long
using namespace std;
int get_rand() {
return abs((rand() << 15) + rand()) + 1;
}
struct treapnode {
int value, pri, subarb;
int minelem, maxelem, mindif;
treapnode *l, *r;
treapnode() {
l = r = nullptr;
subarb = 0;
minelem = mindif = 1e15;
maxelem = value = pri = 0;
}
bool operator ==(const treapnode &other)const {
return (subarb == other.subarb && value == other.value && pri == other.pri && minelem == other.minelem && maxelem == other.maxelem && mindif == other.mindif && l == other.l && r == other.r);
}
bool operator !=(const treapnode &other)const {
return !(*this == other);
}
}*root, *nill;
void rotateLeft(treapnode* &node) {
treapnode* temp = node->l;
node->l = temp->r;
temp->r = node;
node = temp;
}
void rotateRight(treapnode* &node) {
treapnode* temp = node->r;
node->r = temp->l;
temp->l = node;
node = temp;
}
void pull(treapnode* &node) {
if (node == nill) return;
node->maxelem = node->minelem = node->value;
node->subarb = 1;
node->mindif = 1e15;
if (node->l != nill) {
node->subarb += node->l->subarb;
node->minelem = node->l->minelem;
node->mindif = min(node->mindif, node->l->mindif);
node->mindif = min(node->mindif, node->value - node->l->maxelem);
}
if (node->r != nill) {
node->subarb += node->r->subarb;
node->maxelem = node->r->maxelem;
node->mindif = min(node->mindif, node->r->mindif);
node->mindif = min(node->mindif, node->r->minelem - node->value);
}
}
void balance(treapnode* &node) {
if (node == nill) return;
if (node->pri < node->l->pri) {
rotateLeft(node);
}
if (node->pri < node->r->pri) {
rotateRight(node);
}
pull(node->l);
pull(node->r);
pull(node);
}
bool find(treapnode* &node, int val) {
if (node == nill)
return false;
if (node->value == val)
return true;
if (val < node->value)
return find(node->l, val);
return find(node->r, val);
}
void insert(treapnode* &node, int val) {
if (node == nill) {
node = new treapnode();
node->value = node->maxelem = node->minelem = val;
node->mindif = 1e15;
node->subarb = 1;
node->l = node->r = nill;
node->pri = get_rand();
return;
}
if (val < node->value)
insert(node->l, val);
else if (val > node->value)
insert(node->r, val);
balance(node);
}
void erase(treapnode* &node, int val) {
if (val < node->value)
erase(node->l, val);
else if (val > node->value)
erase(node->r, val);
else {
if (node->l == nill && node->r == nill) {
delete node;
node = nill;
return;
}
if (node->l->pri < node->r->pri) {
rotateRight(node);
}
else
rotateLeft(node);
erase(node, val);
}
balance(node);
}
signed main() {
ifstream cin("zeap.in");
ofstream cout("zeap.out");
srand(time(0));
nill = new treapnode();
nill->pri = 0;
nill->minelem = 1e15;
nill->maxelem = 0;
nill->subarb = 0;
nill->mindif = 1e15;
nill->l = nill->r = nullptr;
root = nill;
string s;
while (cin >> s) {
if (s == "I") {
int x;
cin >> x;
if (find(root, x)) continue;
insert(root, x);
}
else if (s == "S") {
int x;
cin >> x;
if (find(root, x))
erase(root, x);
else
cout << "-1\n";
}
else if (s == "C") {
int x;
cin >> x;
cout << find(root, x) << '\n';
}
else if (s == "MIN") {
if (root->subarb < 2)
cout << "-1\n";
else
cout << root->mindif << '\n';
}
else {
if (root->subarb < 2)
cout << "-1\n";
else
cout << root->maxelem - root->minelem << '\n';
}
}
return 0;
}