Cod sursa(job #1784882)

Utilizator Kln1000Ciobanu Bogdan Kln1000 Data 20 octombrie 2016 16:57:21
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

vector <pair<int,int> > v(1);
vector <bool> vaz(1);
int n,c=0;

void up_heap(int target){
    int nod;
    nod=v.size();
    v.push_back({target,++c});
    vaz.push_back(false);
    while (v[nod].first<v[nod/2].first and nod>1){
        swap(v[nod],v[nod/2]);
        nod/=2;}
}

void down_heap(int nod){int nr=v.size()-1;
    while(true)
    {
        int fiu=nod;
        if(nod*2<=nr and v[nod*2].first<v[fiu].first) fiu=nod*2;
        if(nod*2+1<=nr and v[nod*2+1].first<v[fiu].first) fiu=nod*2+1;
        if(fiu==nod) return;
        swap(v[nod],v[fiu]);
        nod=fiu;
    }
}

int main()
{   int query;
    f>>n;
    for (int i=0;i<n;++i){
        f>>query;
        switch(query){
    case 1:{f>>query;up_heap(query);break;}
    case 2:{f>>query;vaz[query]=true;break;}
    case 3:{while(vaz[v[1].second])
            {
                swap(v[1],v.back());
                v.pop_back();
                down_heap(1);
            }
            t<<v[1].first<<'\n';break;}
        }
    }
    return 0;
}