Pagini recente » Cod sursa (job #1356908) | Cod sursa (job #3164961) | Cod sursa (job #2540503) | Cod sursa (job #275173) | Cod sursa (job #539382)
Cod sursa(job #539382)
/*
a[ i ]= elementul intrat al i-lea in multime (deci, practic sirul pe care il citesc)
heap[ i ]= pozitia in sirul a a elementului de pe pozitia i in heap
poz[ i ]= pozitia in heap a elementului de pe poztia i in sirul a
a[heap[ i ]]= valoarea elementului de pe pozitia i in heap
Si de aici lucrezi cu a[heap[ i ]] cand compari valorile. Vectorul poz il folosesti ca sa stii instant care element il stergi.
*/
# include <cstdio>
# include <algorithm>
# define min a [ heap [ 1 ]]
# define open_files freopen ("heapuri.in", "r", stdin); freopen ("heapuri.out", "w", stdout)
using namespace std;
typedef int Array [200001];
int noduri, nrela, tip, n, x;
Array a, heap, poz;
void urca (int x)
{ while (x / 2 && a [ heap [ x ]] < a [ heap [ x / 2 ]]) // nu a ajuns la radicina si fiul e mai mic ca tatal
{ swap (heap [ x ], heap [ x / 2 ]); // interschimba fiul cu tatal
poz [ heap [ x ]] = x;
poz [ heap [ x / 2 ]] = x / 2;
x /= 2; // trecem la urmatorul nivel
}
}
void coboara (int x)
{ int y = 0;
while (x != y)
{ y = x;
if (y * 2 <= noduri && a [ heap [ x ]] > a [ heap [ y * 2]]) x = y * 2;
if (y * 2 + 1 <= noduri && a [ heap [ x ]] > a [ heap [ y * 2 + 1 ]]) x = y * 2 + 1;
swap (heap [ x ], heap [ y ]);
poz [ heap [ x ]] = x;
poz [ heap [ y ]] = y;
}
}
int main ()
{ open_files;
scanf ("%d", &n);
for (; n; --n)
{ scanf ("%d", &tip);
if (tip < 3) scanf ("%d", &x);
if (tip == 1)
{ noduri++; nrela++;
a [ noduri ] = x;
heap [ noduri ] = nrela;
poz [ nrela ] = noduri;
urca (noduri);
}
if (tip == 2)
{ a [ x ] = -1;
urca (poz[x]);
poz [ heap [ 1 ]] = 0;
heap [ 1 ] = heap [ noduri-- ];
poz [ heap [ 1 ]] = 1;
if (noduri > 1) coboara (1);
}
if (tip == 3) printf ("%d\n", min);
}
return 0;
}