Pagini recente » Cod sursa (job #820603) | Cod sursa (job #410523) | Cod sursa (job #2825961) | Cod sursa (job #2081077) | Cod sursa (job #2810434)
#include <fstream>
using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
const int NMAX=2e5;
int heapsize;
int heap[NMAX], poz[NMAX],a[NMAX];// poz patreaza la ce nod se afla val introdusa a i in ordine cronologica, heap pastreaza faptul ca pe nodul i se gaseste valcitita a i cronologic
int parent(int i) {return (i-1)/2;}
int leftchild(int i) {return i*2;}
int rightchild(int i) {return i*2+1;}
void upheap(int i)
{
while(i!=0 and a[heap[parent(i)]]>a[heap[i]])
{
swap(heap[parent(i)],heap[i]);
poz[heap[parent(i)]]=parent(i);
poz[heap[i]]=i;
i=parent(i);
}
}
void downheap(int i)
{
int left, right, smallest;
smallest=i;
left=leftchild(i);
right=rightchild(i);
if(left<heapsize and a[heap[left]]<a[heap[smallest]])
{
smallest=left;
}
if(right<heapsize and a[heap[right]]<a[heap[smallest]])
{
smallest=right;
}
if(i!=smallest)
{
swap(heap[i],heap[smallest]);
poz[heap[i]]=i;
poz[heap[smallest]]=smallest;
downheap(smallest);
}
}
void inserare(int nr)
{
heap[heapsize++]=nr;
upheap(heapsize-1);
}
void extractmin()
{
int minval;
minval=a[heap[0]];
heap[0]=heap[--heapsize];
downheap(0);
}
int getmin()
{
return heap[0];
}
void update(int i, int j)
{
heap[i]=j;
upheap(i);
downheap(i);
}
void eras(int i)
{
update(i,getmin());// ma intereseaza pozitia lui min
extractmin();
}
int main()
{
int n,cer,nr=0,x;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>cer;
if(cer==1)
{
nr++;
cin>>a[nr];
poz[nr]=nr;
inserare(nr);
}
else if(cer==2)
{
cin>>x;
eras(poz[x]);
}
else
{
cout<<a[getmin()]<<'\n';
}
}
return 0;
}