Pagini recente » Cod sursa (job #2642132) | Cod sursa (job #168338) | Cod sursa (job #1742567) | Cod sursa (job #453739) | Cod sursa (job #1577106)
#include <fstream>
#include <cstdio>
#define DMAX 200100
using namespace std;
FILE*fin;
ofstream fout("heapuri.out");
struct arbore
{
int val;
int nrord;
};
arbore H[DMAX];
int poz[DMAX];
int nrop, tip, value, pozmin;
int n;
void inserare(int inf);
void combinare(int i);
void creare_combinari();
int main()
{
fin = freopen("heapuri.in", "r", stdin);
fscanf(fin, "%d", &nrop);
for(int i = 1; i <= nrop; i++)
{
fscanf(fin, "%d", &tip);
if(tip != 3)
{
fscanf(fin, "%d", &value);
if(tip == 1)
inserare(value);
else
{
for(int j = 1; j <= n; j++)
if(H[j].nrord == value)
{
pozmin = j;
break;
}
H[pozmin] = H[n];
n--;
combinare(pozmin);
}
} else fout << H[1].val<< '\n';
}
fout << '\n';
return 0;
}
void inserare(int inf)
{
int fiu, tata;
fiu = ++n;
tata = fiu/2;
while(tata > 0 && H[tata].val > inf)
{
H[fiu] = H[tata];
fiu = tata;
tata = tata/2;
}
H[fiu].val = inf;
H[fiu].nrord = n;
poz[n] = fiu;
}
void combinare(int i)
{
arbore inf = H[i];
int tata, fiu;
tata = i;
fiu = 2*i;
while(fiu <= n)
{
if(fiu + 1 <= n && H[fiu].val > H[fiu + 1].val)
++fiu;
if(H[fiu].val < inf.val)
{
H[tata] = H[fiu];
tata = fiu;
fiu = 2 * tata;
}
else break;
}
H[tata] = inf;
}
void creare_combinari()
{
int i;
for(i = n/2; i >= 0; i--)
combinare(i);
}