Pagini recente » Cod sursa (job #2214301) | Cod sursa (job #1048545) | Cod sursa (job #206826) | Cod sursa (job #2076406) | Cod sursa (job #542231)
Cod sursa(job #542231)
#include<iostream>
#include<fstream>
using namespace std;
class Heap{
int dim,v[200001];
public:
Heap(int dim)
{
this->dim=dim;
}
void put(const int& indice, const int&val)
{
v[indice]=val;
}
int get(const int& indice)
{
return v[indice];
}
int get_dim()
{
return dim;
}
void inc_dim()
{
++dim;
}
void dec_dim()
{
--dim;
}
};
int parinte(int i)
{
return i/2;
}
int left(int i)
{
return 2*i;
}
int right(int i)
{
return 2*i+1;
}
int valori[200001],poz[200001],crono=1;
void heapify(Heap& H, const int& ind)
{
int indmin=ind;
if(left(ind)<=H.get_dim() && valori[H.get(ind)]>valori[H.get(left(ind))])
indmin=left(ind);
if(right(ind)<=H.get_dim() && valori[H.get(indmin)]>valori[H.get(right(ind))])
indmin=right(ind);
if(indmin!=ind)
{
int aux=H.get(ind);
H.put(ind,H.get(indmin));
H.put(indmin,aux);
poz[H.get(indmin)]=indmin;
poz[H.get(ind)]=ind;
heapify(H,indmin);
}
}
void insert(Heap& H, const int& valoare)
{
H.inc_dim();
int ind=H.get_dim();
while(ind>1 && valori[H.get(parinte(ind))]>valori[valoare])
{
H.put(ind,H.get(parinte(ind)));
poz[H.get(parinte(ind))]=ind;
ind=parinte(ind);
}
H.put(ind,valoare);
poz[valoare]=ind;
}
void del(Heap& H, const int& valoare)
{
int dim=H.get_dim();
if(dim==1)
{
H.dec_dim();
return;
}
int indice=poz[valoare];
H.put(indice,H.get(dim));
poz[H.get(dim)]=indice;
H.dec_dim();
heapify(H,indice);
}
int getmin(Heap& H)
{
return valori[H.get(1)];
}
int main()
{
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int n,cod;
in>>n;
Heap h(0);
for(int i=0;i<n;i++)
{
in>>cod;
int val;
if(cod==1) //insert
{
in>>val;
valori[crono]=val;
insert(h,crono);
++crono;
}
else if(cod==2)
{
in>>val;
del(h,val);
}
else
out<<getmin(h)<<"\n";
}
in.close();
out.close();
}