Pagini recente » Cod sursa (job #3242576) | Clasament preONI 2007, Clasele 11-12 | Cod sursa (job #1943930) | Cod sursa (job #2774128) | Cod sursa (job #903030)
Cod sursa(job #903030)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct heapy
{
int x;
int cron;
}h[200001];
int ord[200001],n,nr,nro;
void upheap (int i, heapy z)
{
int j=i/2;
while (z.x<h[j].x)
{
h[i]=h[j];
ord[h[i].cron]=i;
i=j;
j=j/2;
}
h[i]=z;
ord[h[i].cron]=i;
}
void downheap (int i, heapy z)
{
int j;
do
{
j=-1;
if (z.x>h[i*2].x&&i*2<=nr) j=i*2;
if (z.x>h[i*2+1].x&&i*2+1<=nr) { if(j==i*2) {if (h[i*2+1].x<h[j].x) j=i*2+1;}
else j=i*2+1;}
if (j!=-1)
{
h[i]=h[j];
ord[h[i].cron]=i;
i=j;
}
}while (j!=-1);
h[i]=z;
ord[h[i].cron]=i;
}
void add (int x)
{
nr++;nro++;
h[nr].x=x;
ord[nro]=nr;
h[nr].cron=nro;
if (h[nr].x<h[nr/2].x) upheap (nr,h[nr]);
}
void remove (int x)
{
int i=ord[x];
h[i]=h[nr]; ord[h[i].cron]=i; nr--;
if (h[i].x<h[i/2].x) upheap (i,h[i]);
else if (h[i].x>h[i*2].x||h[i].x>h[i*2+1].x) downheap (i,h[i]);
}
int main()
{
int op,x;
fin>>n;
for (int i=1;i<=n;i++)
{
fin>>op;
if (op==1) {fin>>x; add(x);}
else if (op==2) {fin>>x; remove(x);}
else fout<<h[1].x<<"\n";
}
return 0;
}