Pagini recente » Cod sursa (job #596973) | Cod sursa (job #885152) | Cod sursa (job #2436110) | Cod sursa (job #1709914) | Cod sursa (job #245487)
Cod sursa(job #245487)
#include <iostream>
#define NMAX 200005
using namespace std;
struct nod{
int val;
int nrOrdine;
};
nod a[NMAX];
int pozitie[NMAX];
FILE *f = fopen("heapuri.in", "r"), *g = fopen("heapuri.out", "w");
int N, q = 0, nrElemente = 0;
void schimba(int x, int y)
{
int aux;
aux = a[x].val;
a[x].val = a[y].val;
a[y].val = aux;
aux = a[x].nrOrdine;
a[x].nrOrdine = a[y].nrOrdine;
a[y].nrOrdine = aux;
aux = pozitie[a[x].nrOrdine];
pozitie[a[x].nrOrdine] = pozitie[a[y].nrOrdine];
pozitie[a[y].nrOrdine] = aux;
}
void insert(int x, int i)
{
nrElemente++;
a[nrElemente].val = x;
a[nrElemente].nrOrdine = i;
int k = nrElemente;
while (a[k].val < a[k / 2].val)
{
schimba(k, k / 2);
k = k / 2;
}
}
void remove(int x)
{
a[x].val = a[nrElemente].val;
a[x].nrOrdine = a[nrElemente].nrOrdine;
nrElemente--;
pozitie[a[x].nrOrdine] = x;
int k = x;
while ((2 * k + 1 <= nrElemente) && ((a[k].val > a[2 * k].val) || (a[k].val > a[2 * k + 1].val)))
{
if ((a[k].val > a[2 * k].val) && (a[k].val > a[2 * k + 1].val))
{
if (a[2 * k].val > a[2 * k + 1].val)
{
schimba(k, 2 * k + 1);
k = 2 * k + 1;
}
else
{
schimba(k, 2 * k);
k = 2 * k;
}
}
else
{
if (a[k].val > a[2 * k].val)
{
schimba(k, 2 * k);
k = 2 * k;
}
else
{
schimba(k, 2 * k + 1);
k = 2 * k + 1;
}
}
}
if ((2 * k <= nrElemente) && (a[k].val > a[2 * k].val))
{
schimba(k, 2 * k);
k = 2 * k;
}
}
int main()
{
fscanf(f, "%d", &N);
for (int i = 0; i < N; ++i)
{
int tip;
fscanf(f, "%d", &tip);
if (tip != 3)
{
int x;
fscanf(f, "%d", &x);
if (tip == 1)
{
q++;
pozitie[q] = nrElemente + 1;
insert(x, q);
}
else
{
remove(pozitie[x]);
}
}
else
{
fprintf(g, "%d\n", a[1].val);
}
}
fclose(f);
fclose(g);
return 0;
}