Pagini recente » Cod sursa (job #2652461) | Cod sursa (job #316763) | Cod sursa (job #480291) | Cod sursa (job #2546201) | Cod sursa (job #2905612)
#include <fstream>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
const int NMAX=2e5+1;
int heap[NMAX],poz[NMAX],invpoz[NMAX],cnt=0,heap_size=0;
void push(int x)
{
heap_size++;
cnt++;
heap[heap_size]=x;
poz[cnt]=heap_size;
invpoz[heap_size]=cnt;
int parent=heap_size/2;
int child=heap_size;
while(heap[parent]>heap[child])
{
swap(heap[parent],heap[child]);
swap(poz[invpoz[child]],poz[invpoz[parent]]);
swap(invpoz[child],invpoz[parent]);
child=parent;
parent=child/2;
}
}
void erase1(int pozcer)
{
int heap_index=poz[pozcer];
heap[heap_index]=heap[heap_size];
heap_size--;
int parent=heap_index;
int child1=parent*2,child2=parent*2+1;
int x=0;
while(heap[child1]<heap[parent] or heap[child2]<heap[parent])
{
x=1;
if(heap[child1]<heap[child2] and child1<=heap_size)
{
swap(heap[parent],heap[child1]);
swap(poz[invpoz[child1]],poz[invpoz[parent]]);
swap(invpoz[child1],invpoz[parent]);
parent=child1;
}
else if(heap[child2]<heap[child1] and child2<=heap_size)
{
swap(heap[parent],heap[child2]);
swap(poz[invpoz[child2]],poz[invpoz[parent]]);
swap(invpoz[child2],invpoz[parent]);
parent=child2;
}
else
{
break;
}
child1=parent*2;
child2=parent*2+1;
}
if(x==0)
{
int child=heap_index;
parent=child/2;
while(heap[parent]>heap[child])
{
swap(heap[parent],heap[child]);
poz[cnt]=child;
invpoz[child]=cnt;
child=parent;
parent=child/2;
}
}
}
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
{
int cer;
cin>>cer;
if(cer==1)
{
int x;
cin>>x;
push(x);
}
else if(cer==2)
{
int pozcer;
cin>>pozcer;
erase1(pozcer);
}
else if(cer==3)
{
cout<<heap[1]<<endl;
}
}
return 0;
}