Pagini recente » Cod sursa (job #387495) | Cod sursa (job #2637029) | Cod sursa (job #466435) | Cod sursa (job #605072) | Cod sursa (job #1964977)
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>
#define MaxN 100005
#define INF 2140000000
using namespace std;
FILE *IN,*OUT;
int N,Type,X;
class Heap
{
private:
struct _Heap
{
int val,pos;
};
vector <_Heap> H;
vector <int> Pos;
void Make_Infinite(int node)
{
H[node].val=INF;
}
void Swap(int node1,int node2)
{
swap(Pos[H[node1].pos],Pos[H[node2].pos]);
swap(H[node1],H[node2]);
}
void Up_Heap(int node)
{
while(node>=1&&H[node].val<H[node/2].val)
{
Swap(node,node/2);
node/=2;
}
}
void Down_Heap(int node)
{
while(1)
{
int val=INF,son=0;
if(2*node<H.size())
son=2*node,val=H[2*node].val;
if(2*node+1<H.size()&&val>H[2*node+1].val)
son++,val=H[2*node+1].val;
if(son&&val<H[node].val)
{
Swap(node,son);
node=son;
}
else return;
}
}
public:
Heap(){}
int top()
{
if(H.size()==0)
return -1;
else return H[0].val;
}
void Add(int val)
{
_Heap aux;
aux.pos=H.size(),aux.val=val;
Pos.push_back(H.size());
H.push_back(aux);
Up_Heap(H.size()-1);
}
void Delete(int node)
{
node=Pos[node];
Make_Infinite(node);
Down_Heap(node);
H.pop_back();
}
};
int main()
{
IN=fopen("heapuri.in","r");
OUT=fopen("heapuri.out","w");
fscanf(IN,"%d",&N);
Heap heap;
for(int i=1;i<=N;i++)
{
fscanf(IN,"%d",&Type);
if(Type==3)
fprintf(OUT,"%d\n",heap.top());
else if(Type==2)
{
fscanf(IN,"%d\n",&X);
heap.Delete(X-1);
}
else
{
fscanf(IN,"%d\n",&X);
heap.Add(X);
}
}
return 0;
}