Mai intai trebuie sa te autentifici.
Cod sursa(job #1322530)
Utilizator | Data | 20 ianuarie 2015 09:24:04 | |
---|---|---|---|
Problema | Hashuri | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.6 kb |
#include <bits/stdc++.h>
using namespace std;
const int NR_NODES = 1 << 20;
const int INF = 1 << 30;
struct Treap
{
int st, dr;
int key, priority;
Treap(int k = 0, int p = 0)
{
key = k;
priority = p;
st = dr = 0;
}
};
Treap T[NR_NODES];
int root;
void init()
{
srand( time(NULL) );
}
void rol(int &node)
{
int aux = T[node].st;
T[node].st = T[aux].dr;
T[aux].dr = node;
node = aux;
}
void ror(int &node)
{
int aux = T[node].dr;
T[node].dr = T[aux].st;
T[aux].st = node;
node = aux;
}
void balance(int &node)
{
if ( T[ T[node].st ].priority > T[node].priority ) rol( node );
if ( T[ T[node].dr ].priority > T[node].priority ) ror( node );
}
void insert(int &node, int k, int p)
{
if ( !node )
{
node = ++root;
T[node] = Treap(k, p);
}
else
{
if ( T[node].key < k )
insert( T[node].st, k, p );
else
if ( k > T[node].key )
insert( T[node].dr, k, p );
balance(node);
}
}
bool find(int node, int k)
{
if ( !node ) return false;
if ( T[node].key == k ) return true;
if ( k < T[node].key ) return find( T[node].st, k );
else return find( T[node].dr, k );
}
void erase(int &node, int k)
{
if ( !node ) return;
if ( k < T[node].key )
erase( T[node].st, k );
else
if ( k > T[node].key )
erase( T[node].dr, k );
else
{
if ( T[node].st == 0 && T[node].dr == 0 )
{
T[node] = Treap(0, 0);
node = 0;
}
else
{
if ( T[ T[node].st ].priority > T[ T[node].dr ].priority )
{
rol( node );
erase( T[node].dr, k );
}
else
{
ror( node );
erase( T[node].st, k );
}
}
}
}
int main()
{
ifstream in("hashuri.in");
ofstream out("hashuri.out");
ios_base::sync_with_stdio( false );
int N;
init();
in >> N;
while ( N-- )
{
int tip, x;
in >> tip >> x;
switch(tip)
{
case 1: insert(root, x, rand() % INF); break;
case 2: erase(root, x); break;
case 3: out << find(root, x) << "\n"; break;
default: cerr << "Error\n";
}
}
return 0;
}