Pagini recente » Cod sursa (job #861277) | Cod sursa (job #2098694) | Cod sursa (job #650882) | Cod sursa (job #2377725) | Cod sursa (job #1993660)
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
int n,i,x,tip,prio;
struct Treap
{
int val,pr;
Treap *ls,*rs;
Treap()
{
}
Treap(int value,int priority,Treap *a,Treap *b)
{
this->val=value;
this->pr=priority;
this->ls=a;
this->rs=b;
}
}*R,*nil;
int finds(Treap* nod)
{
if(nod->val==x) return 1;
if(nod==nil) return 0;
if(x<nod->val) return finds(nod->ls);
return finds(nod->rs);
}
void rot1(Treap* &nod)
{
Treap *T=nod->ls;
nod->ls=T->rs;T->rs=nod;
nod=T;
}
void rot2(Treap* &nod)
{
Treap *T=nod->rs;
nod->rs=T->ls;T->ls=nod;
nod=T;
}
void balance(Treap* &nod)
{
if(nod->ls->pr>nod->pr)
rot1(nod);
if(nod->rs->pr>nod->pr)
rot2(nod);
}
void ins(Treap* &nod)
{
if(nod==nil)
{
nod=new Treap(x,prio,nil,nil);
return;
}
if(x<nod->val) ins(nod->ls);
else ins(nod->rs);
balance(nod);
}
void del(Treap* &nod)
{
if(x<nod->val) del(nod->ls);
if(x>nod->val) del(nod->rs);
if(x==nod->val)
{
if(nod->ls==nil&&nod->rs==nil)
{
delete nod;
nod=nil;
return;
}
if(nod->ls->pr>nod->rs->pr) rot1(nod);
else rot2(nod);
del(nod);
}
}
int main()
{
ifstream f("hashuri.in");
ofstream g("hashuri.out");
f>>n;
srand(time(NULL));
R=nil=new Treap(0,0,NULL,NULL);
for(i=1;i<=n;i++)
{
f>>tip>>x;prio=rand()+1;
if(tip==1)
{
if(!finds(R)) ins(R);
}
if(tip==2)
{
if(finds(R)) del(R);
}
if(tip==3)
{
g<<finds(R)<<'\n';
}
}
return 0;
}