Cod sursa(job #2954458)

Utilizator poparobertpoparobert poparobert Data 14 decembrie 2022 13:00:54
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.98 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
int n,a;
class heap{
private:
    int hipi[200001],cron[200001],n,inv[200001],ord=0;
public:
    void operator+=(int &a)
    {
        int p=n,p2=(p-1)/2;
        hipi[n++]=a;
        while(p!=0&&hipi[p2]>a)
        {
            hipi[p]=hipi[p2];
            cron[p]=cron[p2];
            inv[cron[p2]]=p;
            p=p2;
            p2=(p-1)/2;
        }
        hipi[p]=a;
        cron[p]=++ord;
        inv[ord]=p;
    }
    void operator--(int a=0)
    {
        int p=0;
        int x=hipi[--n],y=cron[n];
        while(p<n/2)
        {
            int p1=p*2+1,p2=p*2+2;
            if(p1>=n)
                break;
            if(p2>=n)
                p1=p1;
            if(hipi[p1]>hipi[p2])
                swap(p1,p2);
            if(hipi[p1]<x)
            {
                hipi[p]=hipi[p1];
                cron[p]=cron[p1];
                inv[cron[p1]]=p;
                p=p1;
            }
            else if(hipi[p2]<x)
            {
                hipi[p]=hipi[p2];
                cron[p]=cron[p2];
                inv[cron[p2]]=p;
                p=p2;
            }
            else
                break;
        }
        hipi[p]=x;
        cron[p]=y;
        inv[cron[p]]=p;
    }
    void afis(ostream &output)
    {
        output<<hipi[0]<<'\n';
    }
    void operator-=(int &a)
    {
        if(a<=ord)
        {
            int p=inv[a];
            int x=hipi[--n],y=cron[n],z=inv[y];
            while(p<n/2)
            {
                int p1=p*2+1,p2=p*2+2;
                if(p1>=n)
                    break;
                if(p2>=n)
                    p1=p1;
                if(hipi[p1]>hipi[p2])
                    swap(p1,p2);
                if(hipi[p1]<x)
                {
                    hipi[p]=hipi[p1];
                    cron[p]=cron[p1];
                    inv[cron[p1]]=p;
                    p=p1;
                }
                else if(hipi[p2]<x)
                {
                    hipi[p]=hipi[p2];
                    cron[p]=cron[p2];
                    inv[cron[p2]]=p;
                    p=p2;
                }
                else
                    break;
            }
            hipi[p]=x;
            cron[p]=y;
            inv[cron[p]]=p;
        }
    }
    friend ostream& operator<<(ostream& output,heap &a)
    {
        while(a.n)
        {
            output<<a.hipi[0]<<' ';
            a--;
        }
        return output;
    }
};
heap v,c;
int t,cc;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>t;
        if(t<=2)
        {
            cin>>a;
            if(t==1)
            {
                v+=a;
            }
            else
            {
                v-=a;
            }
        }
        else
        {
            v.afis(cout);
        }
    }
    return 0;
}