Pagini recente » Istoria paginii utilizator/sbenghici_ | Cod sursa (job #1371389) | Istoria paginii utilizator/indianu_talpa_iute | Cod sursa (job #2641946) | Cod sursa (job #823009)
Cod sursa(job #823009)
#include <fstream>
using namespace std;
int heap[200001], cron[200001], lvl[200001];
int l = 0;
void add(int x)
{
heap[++l] = x;
cron[l] = l; lvl[l] = l;
int i=l, aux;
while (i > 1 && heap[i] < heap[i/2])
{
aux = heap[i];
heap[i] = heap[i/2];
heap[i/2] = aux;
aux = cron[i];
cron[i] = cron[i/2];
cron[i/2] = aux;
aux = lvl[l];
lvl[l] = lvl[i/2];
lvl[i/2] = aux;
i >>= 1;
}
}
void cerne(int poz)
{
if (2*poz > l) return;
int aux;
if (2*poz == l && heap[l] < heap[poz])
{
aux = heap[poz]; heap[poz] = heap[l]; heap[l] = aux;
aux = cron[poz]; cron[poz] = cron[l]; cron[l] = aux;
lvl[cron[poz]] = poz; lvl[cron[l]] = l;
return;
}
int Min;
if (heap[2*poz] < heap[2*poz+1]) Min = 2*poz;
else Min = 2*poz+1;
if (heap[Min] < heap[poz])
{
aux = heap[poz]; heap[poz] = heap[Min]; heap[Min] = aux;
aux = cron[poz]; cron[poz] = cron[Min]; cron[Min] = aux;
lvl[cron[Min]] = Min; lvl[cron[poz]] = poz;
cerne(Min);
}
}
void del(int x)
{
heap[lvl[x]] = heap[l];
cron[lvl[x]] = cron[l];
lvl[cron[l]] = lvl[x];
l--;
cerne(lvl[x]);
}
int main()
{
ifstream in("heapuri.in"); ofstream out("heapuri.out");
int i, c, x, n;
in>>n;
for (i=0;i<n;++i)
{
in>>c;
switch (c)
{
case 1: in>>x; add(x); break;
case 2: in>>x; del(x); break;
case 3: out<<heap[1]<<"\n"; break;
}
}
return 0;
}