Pagini recente » Cod sursa (job #173205) | Cod sursa (job #2175232) | Cod sursa (job #1640683) | Cod sursa (job #143617) | Cod sursa (job #677024)
Cod sursa(job #677024)
#include <fstream>
#define swap(a,b) int aux = a; a = b; b = aux;
#define NMAX 200000
#define MAXVAL 1000000000
int N, H[NMAX], nr=0, poz=0, Vpoz[NMAX], Vel[NMAX];
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
void reparaHeap(int p)
{
int t;
//reparare dupa o inserare la sfirsit
if (p==nr){
while (p>0 && H[p]<H[(p-1)/2]){
swap(H[p],H[(p-1)/2]);
p = (p-1)/2;
}
} else { //reparare dupa o eliminare
while ((2*p+1<nr && H[p]>H[2*p+1]) || (2*p+2<nr && H[p]>H[2*p+2])){
if (2*p+2<nr && H[2*p+1]>H[2*p+2]) t = 2*p+2; else t = 2*p+1;
swap(H[p],H[t]);
p = t;
}
}
}
void insereaza(int x)
{
Vel[poz++] = x;
if (nr==0){
H[nr++] = x;
} else {
H[nr] = x;
reparaHeap(nr);
nr++;
}
}
int cauta(int x)
{
int i;
for (i=0; i<nr && H[i]!=x; i++);
return i;
}
void elimina(int x)
{
int poz = cauta(Vel[x-1]);
H[poz] = H[--nr];
reparaHeap(poz);
}
int main()
{
int c,x;
f >> N;
for (; N--;){
f >> c;
if (c==1) { f >> x; insereaza(x); } else
if (c==2) { f >> x; elimina(x); } else
if (c==3) { g << H[0] << '\n'; }
}
}