Pagini recente » Cod sursa (job #2931438) | Cod sursa (job #1427299) | Cod sursa (job #719656) | Cod sursa (job #1311425) | Cod sursa (job #244675)
Cod sursa(job #244675)
#include <iostream>
#define NMAX 200005
using namespace std;
FILE *f = fopen("heapuri.in", "r"), *g = fopen("heapuri.out", "w");
int nrElemente = -1, a[NMAX], v[NMAX];
int addHeap(int x)
{
a[++nrElemente] = x;
int i = nrElemente;
while (a[i] < a[(i - 1) / 2])
{
int aux = a[i];
a[i] = a[(i - 1) / 2];
a[(i - 1) / 2] = aux;
i = (i - 1) / 2;
}
return 0;
}
int poz(int i, int k)
{
int x;
if (a[i] == k) return i;
if (a[i] < k)
{
if (2 * i + 2 <= nrElemente) return poz(2 * i + 1, k) + poz(2 * i + 2, k);
else
{
if (2 * i + 1 <= nrElemente) return poz(2 * i + 1, k);
else return 0;
}
}
if (a[i] > k) return 0;
}
int removeHeap(int k)
{
int pozitie = poz(0, k);
//trebuie sa caut pozitia pe care se afla k in heap
int i = pozitie;
a[i] = a[nrElemente--];
//printf("%d\n", pozitie);
while ((2 * i + 2 <= nrElemente) && ((a[2 * i + 1] < a[i]) || (a[2 * i + 2] < a[i])))
{
if ((a[i] > a[2 * i + 1]) && (a[i] > a[2 * i + 2]))
{
if (a[2 * i + 1] > a[2 * i + 2])
{
int aux = a[i];
a[i] = a[2 * i + 2];
a[2 * i + 2] = aux;
i = 2 * i + 2;
}
else
{
int aux = a[i];
a[i] = a[2 * i + 1];
a[2 * i + 1] = aux;
i = 2 * i + 1;
}
}
else
{
if (a[i] > a[2 * i + 1])
{
int aux = a[i];
a[i] = a[2 * i + 1];
a[2 * i + 1] = aux;
i = 2 *i + 1;
}
else
{
int aux = a[i];
a[i] = a[2 * i + 2];
a[2 * i + 2] = aux;
i = 2 * i + 2;
}
}
}
if ((2 * i + 1 <= nrElemente) && (a[i] > a[2 * i + 1]))
{
int aux = a[2 * i + 1];
a[2 * i + 1] = a[i];
a[i] = aux;
i = 2 * i + 1;
}
return 0;
}
int main()
{
int N;
fscanf(f, "%d", &N);
for (int i = 0; i < N; ++i)
{
int n, x;
fscanf(f, "%d", &n);
if (n != 3)
{
fscanf(f, "%d", &x);
}
if (n == 1)
{
addHeap(x);
v[i] = x;
}
if (n == 3)
{
fprintf(g, "%d\n", a[0]);
}
if (n == 2)
{
//printf("remove%d\n", v[x]);
removeHeap(v[x - 1]);
}
/*
for (int j = 0; j <= nrElemente; ++j)
printf("%d ", a[j]);
printf("\n");
*/
}
fclose(f);
fclose(g);
return 0;
}