Cod sursa(job #2301980)

Utilizator refugiatBoni Daniel Stefan refugiat Data 13 decembrie 2018 18:24:40
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream si("heapuri.in");
ofstream so("heapuri.out");
int heap[200005],lg;
int poz[200005],v[200005];
int nr;
void schimb(int a,int b) {
    int aux=heap[a];
    heap[a]=heap[b];
    heap[b]=aux;
}
void up(int p) {
    while(p>>1&&v[heap[p]]<v[heap[p>>1]]) {
        schimb(p,p>>1);
        poz[heap[p]]=p;
        poz[heap[p>>1]]=p>>1;
        p>>=1;
    }
}
void down(int p) {
    int fiu=-1;
    while(p!=fiu) {
        fiu=p;
        if(fiu*2<=lg&&v[heap[p]]>v[heap[fiu*2]]) {
            p=fiu*2;
        }
        if(fiu*2+1<=lg&&v[heap[p]]>v[heap[fiu*2+1]]) {
            p=fiu*2+1;
        }
        schimb(p,fiu);
        poz[heap[p]]=p;
        poz[heap[fiu]]=fiu;
    }
}
int main()
{
    int n;
    si>>n;
    for(int i=1; i<=n; ++i) {
        int a;
        si>>a;
        if(a==1) {
            nr++;
            ++lg;
            si>>v[nr];
            poz[nr]=lg;
            heap[lg]=nr;
            up(lg);
        }
        else
            if(a==2) {
                int b;
                si>>b;
                v[b]=-1;
                up(poz[b]);
                poz[heap[1]]=0;
                heap[1]=heap[lg];
                --lg;
                poz[heap[1]]=1;
                down(1);
            }
            else
                if(a==3)
                    so<<v[heap[1]]<<'\n';
    }
    return 0;
}