P3481
裸treap...
学会了删除..
orz..
#include
<
iostream
>
// #include <fstream>
using namespace std;
// ifstream fin("t3481.in");
const int MAXN = 100000 ;
const int INF = 0x7fffffff ;
int len = 0 ;
struct node
{
node *left,*right;
int key,r_key,value;
} * root,tree[MAXN];
/**/ /*
a
/ \
c b
/ \ / \
g fd e
*/
void RotateLeft(node *& x)
{
node *z=x->right;
x->right=z->left;
z->left=x;
x=z;
}
void RotateRight(node *& x)
{
node *z=x->left;
x->left=z->right;
z->right=x;
x=z;
}
void insert(node *& x, int value, int key)
{
if (NULL==x)
{
node *p=&tree[len++];
p->left=NULL;
p->right=NULL;
p->key=key;
p->value=value;
p->r_key=rand();
x=p;
return;
}
if (x->key<=key)
{
insert(x->right,value,key);
if (x->r_key>x->right->r_key) RotateLeft(x);
}
else
{
insert(x->left,value,key);
if (x->r_key>x->left->r_key) RotateRight(x);
}
}
void _delete(node *& x, int key)
{
if (x==NULL) return;
if (x->key>key) _delete(x->left,key);
else
if (x->key<key) _delete(x->right,key);
else
{
if (x->left==NULL&&x->right==NULL)
{
x=NULL;
return;
}
else
{
int ll,rr;
ll=x->left==NULL?INF:x->left->r_key;
rr=x->right==NULL?INF:x->right->r_key;
if (ll<rr)
{
RotateRight(x);
}
else
{
RotateLeft(x);
}
_delete(x,key);
}
}
}
void find_max(node * x)
{
if (NULL==x) {cout<<0<<endl;return;}
if (x->right!=NULL)
{
find_max(x->right);
}
else
{
cout<<x->value<<endl;
_delete(root,x->key);
return;
}
}
void find_min(node * x)
{
if (NULL==x) {cout<<0<<endl;return;}
if (x->left!=NULL)
{
find_min(x->left);
}
else
{
cout<<x->value<<endl;
_delete(root,x->key);
return;
}
}
int edit;
int main()
{
root=NULL;
while(1)
{
int x,y;
cin>>edit;
if (0==edit) break;
switch(edit)
{
case 1:cin>>x>>y;insert(root,x,y);break;
case 2:find_max(root);break;
case 3:find_min(root);break;
default:break;
}
}
//system("pause");
return 0;
}
// #include <fstream>
using namespace std;
// ifstream fin("t3481.in");
const int MAXN = 100000 ;
const int INF = 0x7fffffff ;
int len = 0 ;
struct node
{
node *left,*right;
int key,r_key,value;
} * root,tree[MAXN];
/**/ /*
a
/ \
c b
/ \ / \
g fd e
*/
void RotateLeft(node *& x)
{
node *z=x->right;
x->right=z->left;
z->left=x;
x=z;
}
void RotateRight(node *& x)
{
node *z=x->left;
x->left=z->right;
z->right=x;
x=z;
}
void insert(node *& x, int value, int key)
{
if (NULL==x)
{
node *p=&tree[len++];
p->left=NULL;
p->right=NULL;
p->key=key;
p->value=value;
p->r_key=rand();
x=p;
return;
}
if (x->key<=key)
{
insert(x->right,value,key);
if (x->r_key>x->right->r_key) RotateLeft(x);
}
else
{
insert(x->left,value,key);
if (x->r_key>x->left->r_key) RotateRight(x);
}
}
void _delete(node *& x, int key)
{
if (x==NULL) return;
if (x->key>key) _delete(x->left,key);
else
if (x->key<key) _delete(x->right,key);
else
{
if (x->left==NULL&&x->right==NULL)
{
x=NULL;
return;
}
else
{
int ll,rr;
ll=x->left==NULL?INF:x->left->r_key;
rr=x->right==NULL?INF:x->right->r_key;
if (ll<rr)
{
RotateRight(x);
}
else
{
RotateLeft(x);
}
_delete(x,key);
}
}
}
void find_max(node * x)
{
if (NULL==x) {cout<<0<<endl;return;}
if (x->right!=NULL)
{
find_max(x->right);
}
else
{
cout<<x->value<<endl;
_delete(root,x->key);
return;
}
}
void find_min(node * x)
{
if (NULL==x) {cout<<0<<endl;return;}
if (x->left!=NULL)
{
find_min(x->left);
}
else
{
cout<<x->value<<endl;
_delete(root,x->key);
return;
}
}
int edit;
int main()
{
root=NULL;
while(1)
{
int x,y;
cin>>edit;
if (0==edit) break;
switch(edit)
{
case 1:cin>>x>>y;insert(root,x,y);break;
case 2:find_max(root);break;
case 3:find_min(root);break;
default:break;
}
}
//system("pause");
return 0;
}