Pagini recente » Cod sursa (job #1376206) | Cod sursa (job #1655274) | Cod sursa (job #1894415) | Cod sursa (job #710863) | Cod sursa (job #2338185)
#include <iostream>
#define NMAX 200000
#define STVAL 100000000
using namespace std;
int val [ NMAX + 1 ] ;
class Heap {
public :
int poz [ NMAX + 1 ] ;
int pozinit [ NMAX + 1 ] ;
int n = 1 ;
void initializare () {
int i ;
for (i = 0 ; i < NMAX ; i++ ) {
val[i] = STVAL ;
poz[i] = 0 ;
}
}
void sift (int k ) {
int son, lson, rson ;
do {
lson = 2 * k ;
rson = 2 * k + 1 ;
if (lson < rson )
son = lson ;
else
son = rson ;
if (val[son] < val[k] ) {
swap(val[son], val[k]) ;
swap(poz[son], poz[k] ) ;
swap(pozinit[poz[son]], pozinit[poz[k]]) ;
}
else
son = 0 ;
} while (son != 0 ) ;
}
void percolate (int k ) {
int father ;
father = k / 2 ;
while (val[father] > val[k] && k > 1 ) {
swap(val[father], val[k] ) ;
swap(poz[father], poz[k] ) ;
swap(pozinit[poz[father]], pozinit[poz[k]]) ;
k = father ;
father = k / 2 ;
}
}
void build_heap () {
int i ;
for (i = n/2 ; i > 0 ; i-- )
sift (i) ;
}
void insertelem (int x ) {
poz[n] = n ;
pozinit[n] = n ;
val[n++] = x ;
percolate(n-1) ;
}
void cutelem (int x ) {
int k = pozinit[x], father ;
val[k] = val[n-1] ;
poz[x] = poz[n-1] ;
pozinit[poz[x]] = pozinit[poz[n-1]] ;
n--;
father = k / 2 ;
if (k > 1 && (val[k] < val[father] ) )
percolate(k) ;
else
sift(k) ;
}
};
int main() {
FILE *fin, *fout ;
fin = fopen ("heapuri.in", "r" ) ;
fout = fopen ("heapuri.out", "w" ) ;
int n, i, tip, elem ;
fscanf (fin, "%d", &n ) ;
Heap h ;
h.initializare() ;
for (i = 0 ; i < n ; i++ ) {
fscanf (fin, "%d", &tip ) ;
switch (tip) {
case 1 : {
fscanf (fin, "%d", &elem ) ;
h.insertelem(elem) ;
break ;
}
case 2 : {
fscanf (fin, "%d\n", &elem ) ;
h.cutelem(elem) ; /// elementul intrat al x ulea
break ;
}
case 3 : {
fprintf (fout, "%d\n", val[1] ) ;
break ;
}
}
}
return 0;
}