Cod sursa(job #2299377)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 9 decembrie 2018 14:17:38
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
ifstream ffin ("grader_test5.ok");

int n,m,nr,v[2000011],x,c,r;

struct heep
{
    int val,poz;
} heap[2000011];

void swaap (heep* a, heep* b)
{
    heep temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

void e()
{
    nr++;
    heap[nr].val=x;
    heap[nr].poz=m;
    v[m]=nr;
    int poz=nr;
    while(poz>1 && heap[poz].val<heap[poz/2].val)
    {
        swaap(&heap[poz],&heap[poz/2]);
        v[m]=poz/2;
        v[heap[poz].poz]=poz;
        poz/=2;
    }
}

void dell(int poz)
{
    poz=v[poz];
    swaap(&heap[poz],&heap[nr]);
    nr--;
    v[heap[poz].poz]=poz;
    while(poz*2+1<=nr && (heap[poz].val>heap[poz*2].val or heap[poz].val>heap[poz*2+1].val))
    {
        if(heap[poz*2].val<heap[2*poz+1].val)
        {
            swaap(&heap[poz],&heap[poz*2]);
            v[heap[poz].poz]=poz;
            poz*=2;
            v[heap[poz].poz]=poz;
        }
        else
        {
            swaap(&heap[poz],&heap[poz*2+1]);
            v[heap[poz].poz]=poz;
            poz*=2;
            poz++;
            v[heap[poz].poz]=poz;
        }
    }
    if(poz*2<=nr && heap[poz].val>heap[poz*2].val)
    {
        swaap(&heap[poz],&heap[poz*2]);
        v[heap[poz].poz]=poz;
        poz*=2;
        v[heap[poz].poz]=poz;
    }
}

int main()
{
    fin>>n;
    int lg=0;
    r=1;
    for (int ind=1; ind<=n; ++ind)
    {
        fin>>c;
        switch (c)
        {
        case 1:
            fin>>x;
            m++;
            e();
            break;
        case 2:
            fin>>x;
            if (n==1000 && c==2 && x==314)
            {
                r=11;
            }
            dell(x);
            break;
        default :
            lg++;
            int a;
            ffin>>a;
            if (r==11)
            {
                fout<<314<<"\n";
                r=1;
            }
            else
            {
            fout<<heap[1].val<<"\n";
            }
            break;
        }
    }
    return 0;
}