Pagini recente » Cod sursa (job #771193) | Cod sursa (job #1026369) | Cod sursa (job #2068511) | Cod sursa (job #543172) | Cod sursa (job #2083317)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int viz[200001];
struct nod
{
int val, ind;
}v[200001];
int left( int i )
{
return 2*i;
}
int right(int i)
{
return 2*i +1;
}
int parinte(int i)
{
return i/2;
}
void down_heap(int x, int heap_size)
{
int son;
do
{
son = 0;
if(left(x) <= heap_size)
{
son = left(x);
if(right(x) <= heap_size && v[right(x)].val<v[left(x)].val)
son = right(x);
if(v[son].val >= v[x].val)
son = 0;
}
if(son)
{
swap(v[x], v[son]);
x=son;
}
}while(son);
}
void up_heap(int x)
{
nod key = v[x];
while((x > 1) && (key.val < v[parinte(x)].val))
{
v[x] = v[parinte(x)];
x = parinte(x);
}
v[x] = key;
}
void del(int x, int &heap_size)
{
v[x] = v[heap_size];
heap_size--;
down_heap(x, heap_size);
}
int main()
{
int n, indice=0, op, elem, heap_size=0, i;
fin>>n;
for(i=1; i<=n; i++)
{
fin>>op;
if(op == 1)
{
fin>>elem;
heap_size++;
indice++;
v[heap_size].val = elem;
v[heap_size].ind = indice;
up_heap(heap_size);
}
if(op == 2)
{
fin>>elem;
viz[elem] = 1;
//in viz marchez ce trebuie sters insa abia cand trebuie sa afisez minimul
//atunci sterg pana ajung la un viz[]0
}
if(op == 3)
{
while ( viz [v[1].ind] == 1)
//cat timp viz[ minim] este 1 inseamna ca trebuie sterse
//si primul nevizitat inseamna ca e minimul care nu ar fi trebuit sa fie sters
del(1, heap_size);
fout<<v[1].val<<'\n';
}
}
}