Pagini recente » Cod sursa (job #374857) | Cod sursa (job #342873) | Cod sursa (job #1467379) | Cod sursa (job #585627) | Cod sursa (job #677121)
Cod sursa(job #677121)
#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(Vpoz[H[p]],Vpoz[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]);
swap(Vpoz[H[p]],Vpoz[H[t]]);
p = t;
}
}
}
void insereaza(int x)
{
Vel[poz++] = x;
Vpoz[x] = poz-1;
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;
//if (H[p]==x) return p;
//int l=0,r=0;
//if (2*p+1<nr && H[2*p+1]<=x) l = cauta(2*p+1,x);
//if (l==0 && 2*p+2<nr && H[2*p+2]<=x) r = cauta(2*p+2,x);
//return l+r;
return Vpoz[x];
}
void elimina(int x)
{
int poz = cauta(Vel[x-1]);
Vpoz[H[nr-1]] = Vpoz[H[poz]];
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'; }
}
}