Pagini recente » Cod sursa (job #1514450) | Diferente pentru algoritmiada-2012/regulament intre reviziile 2 si 3 | Cod sursa (job #1520479) | Monitorul de evaluare | Cod sursa (job #1522038)
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
ifstream f("hashuri.in");
ofstream g("hashuri.out");
struct Treap{
int key,priority;
Treap * left,*right;
Treap(int key,int priority,Treap* left,Treap* right)
{
this->key=key;
this->priority=priority;
this->left=left;
this->right=right;
}
}*Root,*nil;
void rotLeft(Treap* &N)
{
Treap* t=N->left;
N->left=t->right;
t->right=N;
N=t;
}
void rotRight(Treap* &N)
{
Treap* t=N->right;
N->right=t->left;
t->left=N;
N=t;
}
void balance(Treap* N)
{
if(N->priority < N->left->priority)
rotLeft(N);
else if(N->priority<N->right->priority)
rotRight(N);
}
void Insert(int key,int priority,Treap* &N)
{
if(N==nil)
{
N=new Treap(key,priority,nil,nil);
return;
}
if(N->key>key)
{
Insert(key,priority,N->left);
}
else
{
if(N->key<key)
Insert(key,priority,N->right);
}
balance(N);
}
void Erase(int key,Treap* &N)
{
if(N==nil)
return;
if(N->key>key)
{
Erase(key,N->left);
}
else
{
if(N->key<key)
Erase(key,N->right);
else
{
if(N->left==nil && N->right==nil)
delete N,N=nil;
else
{
if(N->left->priority>N->right->priority)
rotLeft(N);
else
rotRight(N);
Erase(key,N);
}
}
}
}
bool Find(int key,Treap* &N)
{
if(N==nil)
return 0;
if(N->key>key)
return Find(key,N->left);
if(N->key<key)
return Find(key,N->right);
return 1;
}
int main()
{
int N;
f>>N;
nil=new Treap(0,0,NULL,NULL);
Root=nil;
for(int i=1;i<=N;i++)
{
int op,x;
f>>op>>x;
if(op==1 && !Find(x,Root))
{
Insert(x,rand()+1,Root);
}
if(op==2 && Find(x,Root))
{
Erase(x,Root);
}
if(op==3)
{
g<<Find(x,Root)<<"\n";
}
}
return 0;
}