Pagini recente » Cod sursa (job #2719925) | Cod sursa (job #371566) | Cod sursa (job #841391) | Cod sursa (job #814931) | Cod sursa (job #1523618)
#include<stdio.h>
using namespace std;
const int N = 200005;
int v[N], h[N], m, poz[N], ct = 0;
void schimba (int p, int x)
{
int aux;
aux = h[p];
h[p] = h[x];
h[x] = aux;
poz[h[p]] = p;
poz[h[x]] = x;
}
void urca (int p)
{
while (p > 1 && v[h[p]] < v[h[p / 2]])
{
schimba (p / 2, p);
p /= 2;
}
}
void coboara (int p)
{
int fS, fD;
fS = p * 2;
fD = p * 2 + 1;
int bun = p;
if (fS <= m && v[h[fS]] < v[h[p]])
bun = fS;
if (fD <= m && v[h[fD]] < v[h[p]])
bun = fD;
if (p != bun)
{
schimba (p, bun);
coboara (bun);
}
}
int main ()
{
FILE *in, *out;
in = fopen ("heapuri.in", "r");
out = fopen ("heapuri.out", "w");
int n;
fscanf (in, "%d", &n);
int i, x, cerinta;
for (i = 1; i <= n; i++)
{
fscanf (in, "%d", &cerinta);
if (cerinta == 1)
{
fscanf (in, "%d", &x);
poz[++ct] = ++m;
h[m] = ct;
v[ct] = x;
urca(m);
}
if (cerinta == 2)
{
fscanf (in, "%d", &x);
poz[v[h[m]]] = poz[x];
h[poz[x]] = h[m];
m--;
urca(poz[x]);
coboara(poz[x]);
}
if (cerinta == 3)
fprintf (out, "%d\n", v[h[1]]);
}
return 0;
}