Pagini recente » Cod sursa (job #683736) | Cod sursa (job #3274492) | Cod sursa (job #697078) | Cod sursa (job #2880499) | Cod sursa (job #1875768)
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
const int NMAX=200005;
int v[NMAX],sz,n,nr;
vector <int> h;
bitset <NMAX> viz;
class Heap
{
public:
Heap(int sz)
{
h.resize(sz);
}
int top()
{
if(viz[h[1]]==0)
return v[h[1]];
else
{
this -> pop();
return top();
}
}
void pop()
{
swap(h[1],h[sz]);
sz--;
down(1);
}
void push(int x)
{
h[++sz]=x;
up(sz);
}
private:
void up(int nod)
{
while((nod>>1)>=1)
{
if(v[h[nod>>1]]>v[h[nod]])
{
swap(h[nod>>1],h[nod]);
nod=nod>>1;
}
else
break;
}
}
void down(int nod)
{
while(nod<<1<=sz)
{
if ((nod<<1)+1<=sz && v[h[nod]]>v[h[nod<<1]] && v[h[nod]]>v[h[(nod<<1)+1]])
{
if(v[h[nod<<1]]<v[h[nod<<1|1]])
{
swap(h[nod<<1],h[nod]);
nod=nod<<1;
}
else
{
swap(h[nod<<1|1],h[nod]);
nod=(nod<<1)+1;
}
continue;
}
if (v[h[nod]]>v[h[nod<<1]])
{
swap(h[nod<<1],h[nod]);
nod=nod<<1;
continue ;
}
if(nod*2+1<=sz && v[h[nod]]>v[h[(nod<<1)+1]])
{
swap(h[(nod<<1)+1], h[nod]);
nod=(nod<<1)+1;
continue ;
}
break ;
}
}
};
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int op,x;
scanf("%d",&n);
Heap *H= new Heap(n+5);
for(int i=1; i<=n; i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d",&x);
v[++nr]=x;
H -> push(nr);
}
else
{
if(op==2)
{
scanf("%d",&x);
viz[x]=1;
}
else
printf("%d\n",H->top());
}
}
return 0;
}