Pagini recente » Cod sursa (job #1395099) | Cod sursa (job #61306) | Cod sursa (job #1565620) | Cod sursa (job #1394850) | Cod sursa (job #2581431)
#include <iostream>
#include<fstream>
#define N 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int h[N];//HEAP MIN
int poz[N];//poz[i]-j -->elementul intrat al i lea acum se afla pe poz j
int m;//nr operatii
int n;//lg heap
void heapup(int nod)
{
int i;
while(nod > 1 && h[nod] < h[nod/2])
{
swap(h[nod], h[nod/2]);
swap(poz[nod], poz[nod/2]);
nod = nod / 2;
}
}
void add(int val)
{
h[++n] = val;
poz[n]=n;
heapup(n);
}
inline int left(int nod)//returneaza poz fiu stanga
{
return 2*nod;
}
inline int right(int nod)
{
return 2 * nod + 1;
}
void heapdown(int nod)
{
int son;
do
{
son=0;
if(left(nod) <= nod)//daca are cel putin un fiu
{
son = left(nod);//pp ca el este mai mic
if(right(nod) && h[right(nod)] <= h[left(nod)])//daca are si fiu dreapta care este mai mic
son=right(nod);
//daca minimul dintre cei 2 fii este tot mai mare nu mai avem unde cobori
if(h[son] >= h[nod])
son=0;
}
if(son)
{
swap(h[nod], h[son]);
swap(poz[nod], poz[son]);
//nod = son; /// ?????????????????????????????
}
}
while(son);
}
void solve3()
{
fout << h[1] << " " ;//minimul
/*h[1]=h[n--];
heapdown(1);*/
}
void sterge(int x)
{
for(int i = 1; i <= n; ++i)
if(poz[i] == x)
{
x=i;
break;
}
h[x] = h[n--];
//vedem daca trebuie urcat sau coborat
if(x>1 && h[x] < h[x / 2])
heapup(x);
else
heapdown(x);
}
int main()
{
int i, op, x;
fin >> m;
for(i = 1; i <= m; ++i)
{
fin >> op;
if(op == 1)
{
fin >> x;
add(x);
}
if(op == 2)
{
fin >> x;
sterge(x);
}
if(op == 3)
solve3();
/*for(int j = 1; j <= n; ++j)
fout << h[j] << " ";
fout << "\n";*/
}
/*for(i = 1; i <= n; ++i)
fout << h[i] << " ";*/
return 0;
}