Pagini recente » Cod sursa (job #551478) | Cod sursa (job #725574) | Cod sursa (job #1495679) | Cod sursa (job #726681) | Cod sursa (job #542200)
Cod sursa(job #542200)
#include<iostream>
#include<fstream>
using namespace std;
class Heap{
int dim,v[200000];
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[200000],poz[200000],crono=1;
void heapify(Heap& H, 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)]=ind;
poz[H.get(ind)]=indmin;
heapify(H,indmin);
}
}
void insert(Heap& H, const int& valoare)
{
H.inc_dim();
H.put(H.get_dim(), valoare);
int par=parinte(H.get_dim());
int ind=H.get_dim();
while(par>=1 && valori[H.get(par)]>valori[H.get(ind)])
{
int aux=H.get(par);
H.put(par,H.get(ind));
H.put(ind,aux);
ind=par;
par=parinte(par);
}
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));
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;
insert(h,crono);
valori[crono]=val;
++crono;
}
else if(cod==2)
{
in>>val;
del(h,val);
}
else
out<<getmin(h)<<"\n";
}
in.close();
out.close();
}