Cod sursa(job #2567723)

Utilizator spartanul300Vasile Andrei spartanul300 Data 3 martie 2020 18:33:52
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

struct heap
{
    int val,ind;
}h[200100];

int k,poz[200100];

void up(int nod)
{
    if(nod/2>0)
    {
        if(h[nod].val<h[nod/2].val)
        {
            poz[h[nod].ind]=nod/2;
            poz[h[nod/2].ind]=nod;
            swap(h[nod],h[nod/2]);
            up(nod/2);
        }
    }
}

void down(int nod)
{
    if(2*nod<=k && 2*nod+1<=k && h[nod].val>min(h[2*nod].val,h[2*nod+1].val))
    {
        if(h[2*nod].val<h[2*nod+1].val)
        {
            poz[h[2*nod].ind]=nod;
            poz[h[nod].ind]=2*nod;
            swap(h[nod],h[2*nod]);
            down(2*nod);
        }
        else
        {
            poz[h[2*nod+1].ind]=nod;
            poz[h[nod].ind]=2*nod+1;
            swap(h[nod],h[2*nod+1]);
            down(2*nod+1);
        }
    }
    else if(2*nod<=k && h[nod].val>h[2*nod].val)
    {
        poz[h[2*nod].ind]=nod;
        poz[h[nod].ind]=2*nod;
        swap(h[nod],h[2*nod]);
        down(2*nod);
    }
}

int n,i,poz_in_heap,op,x;
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>op;
        if(op==1)
        {
            f>>x;
            k++;
            h[k].val=x;
            h[k].ind=k;
            poz[k]=k;
            up(k);
        }
        else if(op==2)
        {
            f>>x;
            poz_in_heap=poz[x];
            h[poz_in_heap].val=INT_MAX;
            down(poz_in_heap);
        }
        else
        {
            g<<h[1].val<<'\n';
        }
    }
    return 0;
}