Pagini recente » Cod sursa (job #1180567) | Cod sursa (job #18537) | Cod sursa (job #1545004) | Cod sursa (job #916858) | Cod sursa (job #3211733)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int nmax=200005;
int heap[nmax],v[nmax],del[nmax];
void sift(int i,int n)
{
int imin,vmin,val;
imin=i;
vmin=val=heap[imin];
if(2*i<=n&&v[heap[2*i]]<v[vmin])
{
imin=2*i;
vmin= heap[imin];
}
if(2*i+1<=n&&v[heap[2*i+1]]<v[vmin])
{
imin = 2*i+1;
vmin= heap[imin = 2*i+1];
}
while(imin >i)
{
heap[i]= heap[imin];
i=imin;
vmin= val;
if(2*i<=n && v[heap[2*i]] < v[vmin])
{
imin=2*i;
vmin= heap[imin];
}
if(2*i+1<=n&&v[heap[2*i+1]]<v[vmin])
{
imin = 2*i+1;
vmin = heap[imin = 2*i+1];
}
}
heap[i]=val;
}
void prelocate(int i)
{
int c,val=heap[i];
c=i/2;
while(i>1&&v[heap[c]]> v[val])
{
heap[i] = heap[c];
i=c;
}
heap[i]=val;
}
void inserted(int i,int &n)
{
n++;
heap[n]=i;
prelocate(n);
}
void deleted(int &n)
{
n--;
heap[1]=heap[n];
sift(1,n);
}
int main()
{
int n;
f>>n;
int pos=0,m=0;
while(n--)
{
int type;
f>>type;
if(type==1)
{
f>>v[++pos];
inserted(pos,m);
}
else if(type==2)
{
int val;
f>>val;
del[val]=1;
}
else
{
while(del[heap[1]])
deleted(m);
g<<v[heap[1]]<<'\n';
}
}
return 0;
}