Pagini recente » Cod sursa (job #783658) | Cod sursa (job #1771868) | Cod sursa (job #790179) | Cod sursa (job #460057) | Cod sursa (job #790468)
Cod sursa(job #790468)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
#define nmax 200005
int n, V[nmax], Heap[nmax], Poz[nmax], cnt_H;
void citeste(){
f >> n;
}
void in_sus(int Nod){
if (Nod == 1) return;
if ( V[ Heap[Nod] ] < V[ Heap[Nod/2] ] ){
swap(Poz[ Heap[Nod] ], Poz[ Heap[Nod/2] ]);
swap(Heap[Nod], Heap[Nod/2]);
in_sus(Nod/2);
}
}
void in_jos(int Nod){
int Fiu_min = Nod;
int St = Nod*2;
int Dr = Nod*2+1;
if ( St <= cnt_H && V[ Heap[St] ] < V[ Heap[Fiu_min] ] ) Fiu_min = St;
if ( Dr <= cnt_H && V[ Heap[Dr] ] < V[ Heap[Fiu_min] ] ) Fiu_min = Dr;
if (Fiu_min == Nod) return;
swap( Poz[ Heap[Nod] ], Poz[ Heap[Fiu_min] ] );
swap( Heap[Nod], Heap[Fiu_min] );
in_jos(Fiu_min);
}
void adauga(int X){
++cnt_H;
++V[0];
V[ V[0] ] = X;
Poz[ V[0] ] = cnt_H;
Heap[cnt_H] = V[0];
in_sus(cnt_H);
}
void sterge(int X){
int poz_H = Poz[X];
Poz[ Heap[cnt_H] ] = Poz[ Heap[ poz_H ] ];
Heap[ poz_H ] = Heap[ cnt_H ];
--cnt_H;
int Nod = Poz[ Heap[ poz_H ] ];
if (Nod > 1 && V[ Heap[Nod] ] < V[ Heap[Nod/2] ]){
in_sus(Nod);
}else in_jos(Nod);
}
void rezolva(){
for(int i=1; i<=n; ++i){
int tip, X;
f >> tip;
if (tip == 1){
f >> X;
adauga(X);
}else if (tip == 2){
f >> X;
sterge(X);
}else{
g << V[ Heap[1] ] << "\n";
}
}
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}