Cod sursa(job #2722574)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 12 martie 2021 23:44:04
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;

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

struct heapuri
{
    long long val,indv;
}heap[200100];

long long t,place[200100];

void up(long long nod)
{
    if(nod>1)
    {
        if(heap[nod/2].val>heap[nod].val)
        {
            swap(heap[nod/2],heap[nod]);
            place[heap[nod/2].indv]=nod/2;
            place[heap[nod].indv]=nod;
            up(nod/2);
        }
    }
}

void down(long long nod)
{
    if(2*nod+1<=t)
    {
        if(heap[2*nod].val<=heap[2*nod+1].val)
        {
            swap(heap[nod],heap[2*nod]);
            place[heap[nod].indv]=nod;
            place[heap[2*nod].indv]=2*nod;
            down(2*nod);
        }
        else
        {
            swap(heap[nod],heap[2*nod+1]);
            place[heap[nod].indv]=nod;
            place[heap[2*nod+1].indv]=2*nod+1;
            down(2*nod+1);
        }
    }
    else if(2*nod<=t)
    {
        swap(heap[nod],heap[2*nod]);
        place[heap[nod].indv]=nod;
        place[heap[2*nod].indv]=2*nod;
        down(2*nod);
    }
}

long long n,i,c,poz,x;
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>c;
        if(c==1)
        {
            f>>x;
            t++;
            heap[t].val=x;
            heap[t].indv=t;
            place[i]=t;
            up(t);
        }
        else if(c==2)
        {
            f>>x;
            poz=place[x];
            heap[poz].val=LONG_LONG_MAX;
            down(poz);
        }
        else g<<heap[1].val<<'\n';
    }
    return 0;
}