Pagini recente » Cod sursa (job #2040654) | Cod sursa (job #2830749) | Cod sursa (job #3175845) | Cod sursa (job #238846) | Cod sursa (job #1094591)
#include <cstdio>
#define Nmax 200002
using namespace std;
FILE *fi = fopen("heapuri.in", "r");
FILE *fo = fopen("heapuri.out", "w");
int v[Nmax];
int ord[Nmax];
int t;
int m = 0;
int n = 0;
void scmb(int &a, int &b)
{
int aux = a;
a = b;
b = aux;
}
void sift(int k, int n)
{
int fiu = 0;
do
{
fiu = 0;
if (2*k <= n)
{
fiu = 2*k;
if (2*k+1 <= n && v[2*k+1] < v[2*k])
fiu = 2*k+1;
if (v[fiu] >= v[k])
fiu = 0;
}
if (fiu)
{
scmb(v[k], v[fiu]);
scmb(ord[k], ord[fiu]);
k = fiu;
}
}while(fiu);
}
void percolate(int k, int n)
{
int val = v[k];
while (k > 1 && val < v[k/2])
{
ord[k] = ord[k/2];
v[k] = v[k/2];
k /= 2;
}
v[k] = val;
ord[k] = n;
}
int cautare(int val, int k)
{
if (ord[k] == val) return k;
if (2*k <= n) cautare(val, 2*k);
if (2*k+1 <= n) cautare(val, 2*k+1);
}
void stergere(int k, int &n)
{
v[k] = v[n];
ord[k] = ord[n--];
if (k > 1 && v[k] < v[k/2]) percolate(k, n);
else sift(k, n);
}
int main()
{
fscanf(fi, "%d", &t);
int x;
int y;
for (; t; t--)
{
fscanf(fi, "%d", &y);
if (y == 1)
{
fscanf(fi, "%d", &x);
v[++n] = x;
ord[n] = ++m;
if (n > 1) percolate(n, n);
}
else if (y == 2)
{
fscanf(fi, "%d", &x);
int poz = cautare(x, 1);
stergere(poz, n);
}
else if (y == 3)
{
fprintf(fo, "%d\n", v[1]);
}
}
return 0;
}