Pagini recente » Cod sursa (job #2929182) | Cod sursa (job #2547679) | Cod sursa (job #433410) | Cod sursa (job #2110723) | Cod sursa (job #1691402)
#include<fstream>
#include<algorithm>
#define DIM 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int Pos[DIM], n, m, k, t, x;
struct str{
int val;
int inh;
} Heap[DIM];
str make_str( int val, int inh ){
str My_str = { val ,inh };
return My_str;
}
void up( int son ){
int father = son / 2;
if( father >= 1 && Heap[son].val < Heap[father].val ){
swap( Pos[ Heap[son].inh ], Pos[ Heap[father].inh ] );
swap( Heap[son], Heap[father] );
up( father );
}
return ;
}
void down( int father ){
int son = father * 2;
if( son + 1 <= n && Heap[son].val > Heap[son + 1].val ){
son++;
}
if( son <= n && Heap[son].val < Heap[father].val ){
swap( Pos[ Heap[son].inh ], Pos[ Heap[father].inh ] );
swap( Heap[son], Heap[father] );
down( son );
}
return ;
}
int main(){
fin>>m;
n = 0;
k = 0;
// Heap[i].val = valuare elementului de pe pozitia i din Heap
// Heap[i].inh = al catelea intrat este elementului de pe pozitia i din Heap
// Pos[i] = pozitia in Heap al celui de-al i lea intrat
for( int i = 1; i <= m ; i++ ){
fin >> t;
if( t == 3 ){
fout << Heap[1].val << "\n";
}
if( t == 1){
fin >> x;
Heap[++n] = make_str( x, ++k );
Pos[k] = n;
up( n );
}
if( t == 2 ){
fin >> x;
int y = Pos[x];
swap( Pos[ Heap[y].inh ], Pos[ Heap[n].inh ] );
swap( Heap[n], Heap[y] );
Pos[ Heap[n].inh ] = 0;
n --;
down( y );
}
}
return 0;
}