Pagini recente » Istoria paginii utilizator/ionutcristea | Monitorul de evaluare | Istoria paginii utilizator/p4ul3lul | Cod sursa (job #406768) | Cod sursa (job #1006876)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cassert>
using namespace std;
class Heap{
private:
int* values;
int* heap;
int* pos;
int dimHeap; //dimensiunea heap-ului
int capVect;
int dim; //pentru inserarea in ord. cronologica in vectorul values
public:
Heap( int capVect ){
this->capVect = capVect;
dimHeap = 0;
dim = 0;
values = new int[this->capVect];
heap = new int[this->capVect];
pos = new int[this->capVect];
}
/*~Heap(){
delete[] values;
delete[] heap;
delete[] pos;
}*/
int parent( int i ){
return i/2;
}
int LeftSubTree( int i ){
return 2*i;
}
int RightSubTree( int i ){
return 2*i+1;
}
void pushUp( int poz ){
//int parent = poz / 2;
while( poz/2 > 1 && values[heap[poz/2]] > values[heap[poz]] ){
swap( heap[poz/2], heap[poz] );
//swap( pos[heap[parent]], pos[heap[poz]] )
pos[heap[poz]] = poz;
pos[heap[poz/2]] = poz/2;
poz /= 2;
//parent = poz / 2;
}
}
void pushDown( int poz ){
while(1){
if( 2*poz + 1 > dimHeap ){
if( 2*poz > dimHeap )
break;
else if( values[heap[2*poz]] < values[heap[poz]] ){
swap( heap[2*poz], heap[poz] );
//swap( pos[heap[2*poz]], pos[heap[poz]] );
pos[heap[2*poz]] = 2*poz;
pos[heap[poz]] = poz;
poz = 2*poz;
}
else
break;
}
else{
if( values[heap[2*poz]] < values[heap[poz]] &&
values[heap[2*poz]] < values[heap[2*poz+1]] ){
swap( heap[2*poz], heap[poz] );
//swap( pos[heap[2*poz]], pos[heap[poz]] );
pos[heap[2*poz]] = 2*poz;
pos[heap[poz]] = poz;
poz = 2*poz;
}
else if( values[heap[2*poz+1]] < values[heap[poz]] &&
values[heap[2*poz+1]] < values[heap[2*poz]] ){
swap( heap[2*poz+1], heap[poz] );
//swap( pos[heap[2*poz+1]], pos[heap[poz]] );
pos[heap[2*poz+1]] = 2*poz+1;
pos[heap[poz]] = poz;
poz = 2*poz+1;
}
else
break;
}
}
}
void insert( int x ){
dimHeap++;
dim++;
values[dim] = x;
heap[dimHeap] = dim;
pos[dim] = dimHeap;
pushUp(dimHeap);
}
int peek(){
return values[heap[1]];
}
void delete1( int i ){
values[i] = -1;
assert( pos[i] != 0 );
assert( 1 <= i && i <= dim );
pushUp( pos[i] );
pos[heap[1]]=0;
heap[1] = heap[dimHeap--];
pos[heap[1]] = 1;
if( dimHeap > 1 ) pushDown(1);
}
};
int main(){
Heap h(200010);
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int cod, x, N;
scanf("%d", &N);
for( int i = 1; i <= N; i++ ){
scanf("%d", &cod );
switch( cod ){
case 1 :
scanf("%d", &x );
h.insert(x);
break;
case 2 :
scanf("%d", &x );
h.delete1(x);
break;
case 3 :
printf("%d\n",h.peek() );
break;
default:
break;
}
}
return 0;
}