Cod sursa(job #2548437)

Utilizator Vladymyr11Pechi Vladimir Stefan Vladymyr11 Data 16 februarie 2020 17:46:03
Problema Heapuri Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>

using namespace std;
int h[200005],nr=0,poz[200005],cnt=0,ind[200005];
void up(int x)
    {
    if (x>1)
        {
        if (h[x]<h[x/2])
            {
            int p1=ind[x];
            int p2=ind[x/2];
            swap(h[x],h[x/2]);
            swap(ind[x],ind[x/2]);
            swap(poz[p1],poz[p2]);
            up(x/2);
            }
        }
    }
void down(int x)
    {
    if (x*2==nr)
        {
        if(h[x]>h[nr])
            {
            int p1=ind[x];
            int p2=ind[nr];
            swap(h[x],h[nr]);
            swap(ind[x],ind[nr]);
            swap(poz[p1],poz[p2]);
            }
        }
    if (x<nr/2)
        {
        if (h[x]>h[x*2]||h[x]>h[x*2+1])
            {
            if (h[x*2]<h[x*2+1])
                {
                int p1=ind[x];
                int p2=ind[x*2];
                swap(h[x],h[x*2]);
                swap(ind[x],ind[x*2]);
                swap(poz[p1],poz[p2]);
                down(x*2);
                }
            else
                {
                int p1=ind[x];
                int p2=ind[x*2+1];
                swap(h[x],h[x*2+1]);
                swap(ind[x],ind[x*2+1]);
                swap(poz[p1],poz[p2]);
                down(x*2+1);
                }
            }
        }
    }
void add(int x)
    {
    nr++;
    cnt++;
    h[nr]=x;
    ind[nr]=cnt;
    poz[cnt]=nr;
    up(nr);
    }
void del(int x)
    {
    int p1=ind[poz[x]];
    int p2=ind[nr];
    swap(h[poz[x]],h[nr]);
    swap(ind[poz[x]],ind[nr]);
    swap(poz[p1],poz[p2]);
    nr--;
    up(poz[p2]);
    down(poz[p2]);
    }
int main()
{
    ifstream fin ("heapuri.in");
    ofstream fout ("heapuri.out");
    int n,t,x;
    fin>>n;
    for (int i=1;i<=n;i++)
        {
        fin>>t;
        if (t==1)
            {
            fin>>x;
            add(x);
            }
        if (t==2)
            {
            fin>>x;
            del(x);
            }
        if (t==3)
            fout<<h[1]<<"\n";
        }
    fin.close();
    fout.close();
    return 0;
}