Pagini recente » Cod sursa (job #1771643) | Cod sursa (job #897533) | Cod sursa (job #2280413) | Cod sursa (job #2646720) | Cod sursa (job #2082693)
//#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
struct el
{
int val,pos;
};
el heap[200100];
int pozitii[200100];
int j;
int marime_heap;
void swap(int x,int y)
{
el aux=heap[x];
heap[x]=heap[y];
heap[y]=aux;
pozitii[heap[x].pos]^=pozitii[heap[y].pos];
pozitii[heap[y].pos]^=pozitii[heap[x].pos];
pozitii[heap[x].pos]^=pozitii[heap[y].pos];
}
int min_heapify(int x)
{
if(x<=marime_heap)
{
int minim=x;
int st=2*x;
int dr=2*x+1;
if(st<=marime_heap&&heap[st].val<heap[minim].val)minim=st;
if(dr<=marime_heap&&heap[dr].val<heap[minim].val)minim=dr;
if(minim!=x)
{
swap(minim,x);
return min_heapify(minim);
}
else return x;
}
}
void urcare(int x)
{
while(x!=1&&heap[x].val<heap[x/2].val)
{
swap(x,x/2);
x/=2;
}
}
void inserare(int el)
{
marime_heap++;
j++;
heap[marime_heap].val=el;
heap[marime_heap].pos=j;
pozitii[j]=marime_heap;
urcare(marime_heap);
}
void stergere(int cron)
{
int var=pozitii[cron];
swap(pozitii[cron],marime_heap);
marime_heap--;
int pozitie=min_heapify(var);
urcare(pozitie);
}
int main()
{
int val;
int poz_sters;
int nrop;
int op;
in>>nrop;
for(int i=1; i<=nrop; i++)
{
in>>op;
switch(op)
{
case 1:
{
in>>val;
inserare(val);
break;
}
case 2 :
{
in>>poz_sters;
stergere(poz_sters);
break;
}
case 3:
{
out<<heap[1].val<<'\n';
break;
}
}
/*for(int gsg=1;gsg<=marime_heap;gsg++)cout<<heap[gsg].val<<" "<<heap[gsg].pos<<'\n';
cout<<"HEAP"<<"\n";*/
}
return 0;
}