Pagini recente » Cod sursa (job #2944641) | Cod sursa (job #2271020) | Cod sursa (job #1793456) | Cod sursa (job #829446) | Cod sursa (job #1164300)
#include<iostream>
#include<fstream>
#include<string.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define INF 1<<30
class Treap {
int info,priority;
Treap *left,*right;
private:
void balance(Treap *&nod);
public :
Treap ();
Treap (int _info, int _priority, Treap *_left, Treap *_right);
void rot_left(Treap *&nod);
void rot_right(Treap *&nod);
void insert(Treap *&nod, int _info, int _priority);
int search(Treap *nod, int _info);
void erase(Treap *&nod, int _info) ;
};
Treap *nil = new Treap(0,0,NULL,NULL);
Treap :: Treap ()
{
this->info=0;
this->priority=0;
this->left=this->right=nil;
}
Treap :: Treap (int _info, int _priority, Treap *_left, Treap *_right) {
this->info=_info;
this->priority=_priority;
this->left=_left;
this->right=_right;
}
void Treap :: balance(Treap *&nod) {
if(nod->left->priority>nod->priority)
rot_right(nod);
if(nod->right->priority>nod->priority)
rot_left(nod);
}
void Treap :: rot_left(Treap *&nod) {
Treap *aux = nod->right;
nod->right = aux->left;
aux->left = nod;
nod = aux;
}
void Treap :: rot_right(Treap *&nod) {
Treap *aux = nod->left;
nod->left = aux->right;
aux->right = nod;
nod = aux;
}
void Treap :: insert(Treap *&nod, int _info, int _priority) {
if(nod==nil) {
nod=new Treap(_info,_priority,nil,nil);
return ;
}
if(_info<=nod->info)
insert(nod->left,_info,_priority);
else insert(nod->right,_info,_priority);
balance(nod);
}
int Treap :: search(Treap *nod, int _info) {
if(nod==nil)
return 0;
if(nod->info==_info)
return 1;
if(_info<=nod->info)
return search(nod->left,_info);
else return search(nod->right,_info);
}
void Treap :: erase(Treap *&nod, int _info) {
if(nod==nil)
return ;
if(_info<nod->info)
erase(nod->left,_info);
else if(_info>nod->info)
erase(nod->right,_info);
else {
if(nod->left==nil && nod->right==nil) {
delete nod;
nod=nil;
return ;
}
if(nod->left->priority>nod->priority)
rot_right(nod);
else rot_left(nod);
erase(nod,_info);
}
}
Treap *p = new Treap(0,0,nil,nil);
int main ()
{
int i,n,op,x;
ifstream f("hashuri.in");
ofstream g("hashuri.out");
f>>n;
for(i=1;i<=n;i++) {
f>>op>>x;
if(op==1) {
if(p->search(p,x)==0)
p->insert(p,x,rand()+1);
}
else if(op==2) {
if(p->search(p,x)==1)
p->erase(p,x);
}
else g<<p->search(p,x)<<'\n';
}
f.close();
g.close();
return 0;
}