Pagini recente » Cod sursa (job #1496428) | Cod sursa (job #1958132) | Cod sursa (job #2357555) | Cod sursa (job #2864372) | Cod sursa (job #1317982)
#include <fstream>
#define DIM 200001
using namespace std;
int heap[DIM], lung, lim, x, poz[DIM], nr[DIM], p, add, n, com;
void adauga(int x)
{
add++;
lung++;
lim=lung;
while(heap[lim/2]>x&&lim>1)
{
heap[lim]=heap[lim/2];
nr[lim]=nr[lim/2];
poz[nr[lim]]=lim;
lim/=2;
}
heap[lim]=x;
nr[lim]=add;
poz[add]=lim;
}
void sterge(int x)
{
p=poz[x];
swap(heap[p], heap[lung]);
swap(nr[p], nr[lung]);
poz[nr[p]]=p; poz[nr[lung]]=lung;
lung--;
while(heap[p]<heap[p/2]&&p>1)
{
heap[p]=heap[p/2];
p=p/2;
}
while((heap[p]>heap[2*p]||heap[p]>heap[2*p+1])&&(2*p<=lung))
{
if((heap[2*p]<heap[2*p+1]||(2*p+1>lung))&&(2*p<=lung))
{
swap(heap[p], heap[2*p]);
swap(nr[p], nr[2*p]);
poz[nr[p]]=p; poz[nr[2*p]]=2*p;
p=2*p;
}
else if(2*p+1<=lung)
{
swap(heap[p], heap[2*p+1]);
swap(nr[p], nr[2*p+1]);
poz[nr[p]]=p; poz[nr[2*p+1]]=2*p+1;
p=2*p+1;
}
}
}
int main()
{
ifstream in("heapuri.in");
ofstream out ("heapuri.out");
in>>n;
for(int i=1; i<=n; ++i)
{
in>>com;
if(com==1)
{
in>>x;
adauga(x);
}
else if(com==2)
{
in>>x;
sterge(x);
}
else
out<<heap[1]<<"\n";
}
in.close();
out.close();
return 0;
}