Cod sursa(job #1875768)

Utilizator andraSaceliAndra Saceli andraSaceli Data 11 februarie 2017 15:43:28
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
const int NMAX=200005;
int v[NMAX],sz,n,nr;
vector <int> h;
bitset <NMAX> viz;
class Heap
{
public:
    Heap(int sz)
    {
        h.resize(sz);
    }
    int top()
    {
        if(viz[h[1]]==0)
            return v[h[1]];
        else
        {
            this -> pop();
            return top();
        }
    }
    void pop()
    {
        swap(h[1],h[sz]);
        sz--;
        down(1);
    }
    void push(int x)
    {
        h[++sz]=x;
        up(sz);
    }
private:
    void up(int nod)
    {
        while((nod>>1)>=1)
        {
            if(v[h[nod>>1]]>v[h[nod]])
            {
                swap(h[nod>>1],h[nod]);
                nod=nod>>1;
            }
            else
                break;
        }
    }
    void down(int nod)
    {
        while(nod<<1<=sz)
        {
            if ((nod<<1)+1<=sz && v[h[nod]]>v[h[nod<<1]] && v[h[nod]]>v[h[(nod<<1)+1]])
            {
                if(v[h[nod<<1]]<v[h[nod<<1|1]])
                {
                    swap(h[nod<<1],h[nod]);
                    nod=nod<<1;
                }
                else
                {
                    swap(h[nod<<1|1],h[nod]);
                    nod=(nod<<1)+1;
                }
                continue;
            }
            if (v[h[nod]]>v[h[nod<<1]])
            {
                swap(h[nod<<1],h[nod]);
                nod=nod<<1;
                continue ;
            }
            if(nod*2+1<=sz && v[h[nod]]>v[h[(nod<<1)+1]])
            {
                swap(h[(nod<<1)+1], h[nod]);
                nod=(nod<<1)+1;
                continue ;
            }
            break ;
        }
    }
};
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int op,x;
    scanf("%d",&n);
    Heap *H= new Heap(n+5);
    for(int i=1; i<=n; i++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d",&x);
            v[++nr]=x;
            H -> push(nr);
        }
        else
        {
            if(op==2)
            {
                scanf("%d",&x);
                viz[x]=1;
            }
            else
                printf("%d\n",H->top());
        }
    }
    return 0;
}