Pagini recente » Cod sursa (job #11272) | Cod sursa (job #1135694) | Cod sursa (job #929521) | Cod sursa (job #2764505) | Cod sursa (job #1378684)
using namespace std;
#include <fstream>
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
#define Nmax 200001
int heap[Nmax], lg = 0; // heap care contine indicii elementelor in vectorul v
int v[Nmax], nr = 0; // numerele citite in ordine
int poz[Nmax]; // pozitia in heap a elementului de pe pozitia i in vectorul v
void adauga(int) ;
void sterge(int) ;
int main()
{
int n, a, tip;
fin >> n;
for(; n; --n)
{
fin >> tip;
if(tip == 3) fout << v[heap[1]] << '\n';
else
{
fin >> a;
if(tip == 1) adauga(a);
else sterge(poz[a]);
}
}
return 0;
}
void adauga(int val)
{ //adauga elementul val
nr++; lg++;
v[nr] = val; heap[lg] = nr; poz[nr] = lg;
for(int p = lg; p > 1 && v[heap[p / 2]] > v[heap[p]]; p /= 2)
{
swap(heap[p], heap[p / 2]);
swap(poz[heap[p]], poz[heap[p / 2]]);
}
}
void sterge(int p)
{ //sterge elementul de pe pozitia p din heap
heap[p] = heap[lg]; heap[lg] = 0; --lg;
poz[heap[p]] = p;
for(int fiu; ; )
{
fiu = p;
if(2 * p <= lg && v[heap[2 * p]] < v[heap[fiu]]) fiu = 2 * p;
if(2 * p + 1 <= lg && v[heap[2 * p + 1]] < v[heap[fiu]]) fiu = 2 * p + 1;
if(p == fiu) return;
else
{
swap(heap[p], heap[fiu]);
swap(poz[heap[p]], poz[heap[fiu]]);
p = fiu;
}
}
}