Pagini recente » Istoria paginii runda/onis-2014-runda-1/clasament | Cod sursa (job #78027) | Cod sursa (job #1881595) | Cod sursa (job #307919) | Cod sursa (job #677045)
Cod sursa(job #677045)
#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 p, 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;
}
void elimina(int x)
{
int poz = cauta(0,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'; }
}
}