Cod sursa(job #2737064)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 4 aprilie 2021 13:20:26
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

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

struct heapuri
{
    int val,ind;
}h[200100];
int t,poz[200100];

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

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

int i,n,c,x,poz_in_heap;
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>c;
        if(c==1)
        {
            f>>x;
            t++;
            h[t].val=x;h[t].ind=t;poz[t]=t;
            up(t);
        }
        else if(c==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;
}