Cod sursa(job #1748899)

Utilizator sfechisalin@yahoo.comSfechis Alin [email protected] Data 27 august 2016 11:44:06
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
#define NN 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int heap[NN],poz_v[NN],v[NN],x,n,op;
void percolate(int poz)
{
    if(poz>1 && v[heap[poz]]<=v[heap[poz>>1]])
    {
        poz_v[heap[poz]]=poz>>1;
        poz_v[heap[poz>>1]]=poz;
        swap(heap[poz],heap[poz>>1]);
        percolate(poz>>1);
    }
}
int ind_min(int poz)
{
    if(2*poz+1<=heap[0])
        return ((v[heap[2*poz]]<v[heap[2*poz+1]])?(2*poz):(2*poz+1));
    return 2*poz;
}
void sift(int poz)
{
    if(2*poz<=heap[0])
    {
        int ind=ind_min(poz);
        if(v[heap[poz]]>v[heap[ind]])
        {
            poz_v[heap[poz]]=ind;
            poz_v[heap[ind]]=poz;
            swap(heap[poz],heap[ind]);
            sift(ind);
        }
    }
}
int main()
{
    fin>>n;
    while(n--)
    {
        fin>>op;
        if(op<3){fin>>x;}
        switch(op)
        {
        case 1:
            {
                v[++v[0]]=x;
                heap[++heap[0]]=heap[0];
                poz_v[++poz_v[0]]=poz_v[0];
                percolate(heap[0]);
                break;
            }
        case 2:
            {
                v[x]=-1;
                percolate(poz_v[x]);
                swap(heap[1],heap[heap[0]--]);
                poz_v[heap[1]]=1;
                if(heap[0]>1)
                    sift(1);
                break;
            }
        case 3:
            {
                fout<<v[heap[1]]<<"\n";
                break;
            }
        }
    }
}