POJ 1442 Black Box (Treap)

来源:互联网 发布:got it get it gotcha 编辑:程序博客网 时间:2024/06/07 19:59

http://poj.org/problem?id=1442
题意:每次操作插入一个数或者GET一个数,每次GET出的是第K大的数,K在每次GET后都要加一。
题解:其实完全可以不用Treap做,为了训练一下就用Treap写了。

using namespace std;vector<int> v;struct Treapnode{    Treapnode *left,*right;    int value,fix;    Treapnode(int a)    {        this->value=a;        this->fix=rand();        this->left=this->right=NULL;    }};Treapnode *root;void Treapleft(Treapnode *&a){    Treapnode *b=a->right;    a->right=b->left;    b->left=a;    a=b;}void Treapright(Treapnode *&a){    Treapnode *b=a->left;    a->left=b->right;    b->right=a;    a=b;}void Treapprint(Treapnode *p){    if(p!=NULL)    {        if(p->left!=NULL)            Treapprint(p->left);        v.pb(p->value);        if(p->right!=NULL)            Treapprint(p->right);    }}void Treapinsert(Treapnode *&p,int value){    if(p==NULL)    {        p=new Treapnode(value);    }    else    {        if(value<=p->value)        {            Treapinsert(p->left,value);            if(p->left->fix<p->fix && p->left!=NULL)                Treapright(p);        }        else        {            Treapinsert(p->right,value);            if(p->right->fix<p->fix && p->right!=NULL)                Treapleft(p);        }    }}int n,m,k;int in[300010],ou[300010];int main(){    cin>>n>>m;    for(int i=1;i<=n;i++)    {        cin>>in[i];    }    for(int i=1;i<=m;i++)    {        int x;        cin>>x;        ou[x]++;    }    for(int i=1;i<=n;i++)    {        Treapinsert(root,in[i]);        if(ou[i])        {            v.clear();            if(root!=NULL)                Treapprint(root);            for(int j=0;j<ou[i];j++)            {                cout<<v[k]<<endl;                k++;            }        }    }    return 0;}