Pagini recente » Cod sursa (job #1227456) | Cod sursa (job #2576356) | Cod sursa (job #116901) | Cod sursa (job #95723) | Cod sursa (job #2808476)
#include <iostream>
#include <stdio.h>
using namespace std;
#define NMAX 200000
int heap[NMAX+1], heapSize = 1;
int ind[NMAX+1], ind2[NMAX+1];
void adauga( int val ) {
int i;
heap[heapSize++] = val;
i = heapSize - 1;
while( i && heap[i] < heap[i/2] ) {
swap( heap[i], heap[i/2] );
swap( ind[i], ind[i/2] );
ind2[ind[i/2]] = i / 2;
ind2[ind[i]] = i;
i = i / 2;
}
}
void sterge( int poz ) {
heap[poz] = heap[heapSize-1];
heapSize--;
while( 2 * poz < heapSize && heap[poz] > min( heap[2*poz], heap[2*poz+1] ) ) {
if( heap[2*poz] < heap[2*poz+1] ) {
swap( heap[poz], heap[2*poz] );
swap( ind[poz], ind[2*poz] );
ind2[ind[poz*2]] = poz * 2;
ind2[ind[poz]] = poz;
poz = 2 * poz;
}
else {
swap( heap[poz], heap[2*poz+1] );
swap( ind[poz], ind[2*poz+1] );
ind2[ind[poz*2+1]] = poz * 2 + 1;
ind2[ind[poz]] = poz;
poz = 2 * poz + 1;
}
}
}
int main() {
FILE *fin, *fout;
int q, n, op, x;
fin = fopen( "heapuri.in", "r" );
fout = fopen( "heapuri.out", "w" );
fscanf( fin, "%d", &q );
n = 1;
while( q-- ) {
fscanf( fin, "%d", &op );
if( op == 1 ) {
fscanf( fin, "%d", &x );
ind[n] = n;
ind2[n] = n;
n++;
adauga(x);
}
else if( op == 2 ) {
fscanf( fin, "%d", &x );
sterge( ind2[x] );
}
else
fprintf( fout, "%d\n", heap[1] );
/* for( i = 1; i < heapSize; i++ )
printf( "%d ", heap[i] );
printf( "\n" );
for( i = 1; i < heapSize; i++ )
printf( "%d ", ind2[i] );
printf( "\n" );
printf( "\n" ); */
}
fclose( fin );
fclose( fout );
return 0;
}