Pagini recente » Cod sursa (job #1762040) | Tower | Clasament | Ciob | Cod sursa (job #1691640)
#include <bits/stdc++.h>
using namespace std;
#ifdef INFOARENA
#define cout fout
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
#else
ifstream fin("date.in");
#endif // INFOARENA
/// ///////////////////////////////////////////
struct T{
int pr,val;
T *left,*right;
};
T* nil=new T({0,0,NULL,NULL});
T* root=nil;
void rot_left(T*&n)
{
T*son = n->left;
n->left = son->right;
son->right = n;
n=son;
}
void rot_right(T*&n)
{
T*son = n->right;
n->right = son->left;
son->left = n;
n=son;
}
void balance(T *&n)
{
if(n->left->pr>n->pr) rot_left(n);
else if(n->right->pr>n->pr) rot_right(n);
}
void insert_treap(T *&n,int pr,int val)
{
if(n==nil)
{
n=new T({pr,val,nil,nil});
return;
}
if(n->val==val) return;
if(n->val>val) insert_treap(n->left,pr,val);
else insert_treap(n->right,pr,val);
balance(n);
}
void delete_treap(T*&n,int val)
{
if(n==nil) return;
if(n->left==nil && n->right==nil)
{
if(n->val==val) n=nil;
return;
}
if(n->val>val) delete_treap(n->left,val);
else if(n->val<val) delete_treap(n->right,val);
else{
if(n->left->pr > n->right->pr) rot_left(n);
else rot_right(n);
delete_treap(n,val);
}
}
bool quer(T *n,int val)
{
if(n==nil) return false;
if(n->val==val) return true;
if(val<n->val) return quer(n->left,val);
else return quer(n->right,val);
}
int main()
{
int n,tip,x;
fin>>n;
for(;n;--n)
{
fin>>tip>>x;
if(tip==1)insert_treap(root,rand()+1,x);
else if(tip==2) delete_treap(root,x);
else cout<<quer(root,x)<<'\n';
}
}