Pagini recente » Cod sursa (job #2103278) | Cod sursa (job #1650238) | Profil Ana-paciu | Istoria paginii utilizator/uwudaviduwu | Cod sursa (job #2078666)
#include <fstream>
#include <limits>
#define nmax 200002
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int poz[nmax],heap_size,nr;
struct element{int val,ord;} v[nmax];
void interschimba(int i,int j)
{
element aux=v[i];
v[i]=v[j];
v[j]=aux;
int aux2=poz[v[i].ord];
poz[v[i].ord]=poz[v[j].ord];
poz[v[j].ord]=aux2;
}
void InsMinHeap(int x)
{
v[++heap_size].val=x;
poz[++nr]=heap_size;
v[heap_size].ord=nr;
int k=heap_size;
while(k!=1)
{
int tata=k/2;
if(v[tata].val>v[k].val)
interschimba(tata,k);
k/=2;
}
}
int MinHeapify(int k)
{
if(k<=heap_size)
{
int minim=k;
if(k*2<=heap_size && v[k*2].val<v[k].val)
minim=k*2;
if(k*2+1<=heap_size && v[k*2+1].val<v[minim].val)
minim=k*2+1;
if(minim!=k)
{
interschimba(k,minim);
return MinHeapify(minim);
}
else return k;
}
}
void DelXthIn(int x)
{
int poz_deleted=poz[x];
interschimba(poz[x],heap_size);
--heap_size;
poz_deleted=MinHeapify(poz_deleted);
while(poz_deleted!=1 && v[poz_deleted].val<v[poz_deleted/2].val)
{
interschimba(poz_deleted,poz_deleted/2);
poz_deleted/=2;
}
}
int main()
{
int n;
f>>n;
for(int i=1; i<=n; ++i)
{
int op;
f>>op;
if(op==1)
{
int x;
f>>x;
InsMinHeap(x);
}
else if (op==2)
{
int x;
f>>x;
DelXthIn(x);
}
else g<<v[1].val<<'\n';
/*for(int j=1;j<=heap_size;++j) g<<v[j].val<<' ';
g<<'\n';
for(int j=1;j<=heap_size;++j) g<<v[j].ord<<' ';
g<<'\n';
for(int j=1;j<=nr;++j) g<<poz[j]<<' ';
g<<"\n\n";*/
}
return 0;
}