Pagini recente » Cod sursa (job #11068) | Cod sursa (job #271119) | Cod sursa (job #2830043) | Cod sursa (job #2250031) | Cod sursa (job #1577882)
#include <fstream>
#include <cstdio>
using namespace std;
FILE*fin;
ofstream fout("heapuri.out");
struct heap
{
int info;
int nr;
};
heap H[200100];
int nrop, x, n, caz, intro, poz[200100];
void inserare(int value)
{
int i, tata = value, fiu;
++intro;
++n;
fiu = n;
tata = fiu/2;
while(tata > 0 && H[tata].info > value)
{
H[fiu] = H[tata];
poz[H[tata].nr] = fiu;
fiu = tata;
tata = tata/2;
}
H[fiu].info = value;
H[fiu].nr = intro;
poz[intro] = fiu;
}
void combinare(int startposition)
{
heap node = H[startposition];
int fiu, tata;
tata = startposition;
fiu = 2 * startposition;
while(fiu <= n)
{
if(fiu <= n && H[fiu].info >= H[fiu + 1].info)
++fiu;
if(H[fiu].info < node.info)
{
H[tata] = H[fiu];
poz[H[fiu].nr] = tata;
tata = fiu;
fiu = 2 * tata;
}
}
H[tata] = node;
poz[H[tata].nr] = tata;
}
int main()
{
int i;
fin = freopen("heapuri.in", "r", stdin);
fscanf(fin, "%d", &nrop);
for(i = 1; i <= nrop; i++)
{
fscanf(fin, "%d", &caz);
if(caz == 3)
{
fout << H[1].info << '\n';
}
else
{
fscanf(fin, "%d", &x);
if(caz == 1)
{
inserare(x);
}
else
{
H[poz[x]] = H[n];
--n;
poz[H[poz[x]].nr] = x;
combinare(poz[x]);
}
}
}
return 0;
}
/*
#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);
}
*/