Pagini recente » Cod sursa (job #1857665) | Cod sursa (job #1562578) | Cod sursa (job #890537) | Cod sursa (job #1410370) | Cod sursa (job #2890525)
#include <fstream>
#include <unordered_map>
using namespace std;
const int dim = 200003;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[dim];
int ordine[dim], o = 0;
unordered_map<int, int> umap;
void swap(int a, int b) {
int aux = v[a];
v[a] = v[b];
int auxp = umap[ v[b] ];
umap[ v[b] ] = umap[ aux ];
umap[ aux ] = auxp;
v[b] = aux;
}
void goUp(int v[], int dim, int nod) {
// int key = v[nod];
while( nod > 1 && v[nod] < v[ nod / 2 ] ) {
// umap[ v[nod / 2] ] = umap[ v[nod] ];
// v[nod] = v[ nod / 2 ];
swap(nod, nod / 2);
nod /= 2;
}
// umap[ key ] = umap[ v[nod] ];
// v[nod] = key;
}
void goDown(int v[], int dim, int nod) {
int son;
do {
son = 0;
if( nod * 2 <= dim ) {
son = nod * 2;
if( nod * 2 + 1 <= dim && v[nod * 2 + 1] < v[son] )
son = nod * 2 + 1;
if( v[son] >= v[nod] )
son = 0;
}
if( son ) {
swap(son, nod);
nod = son;
}
} while( son );
}
int main() {
int n, op, nod, dim = 0, poz;
fin >> n;
for(int i = 0; i < n; i++) {
fin >> op;
if( op != 3 ) fin >> nod;
if( op == 1 ) {
//inseram
v[++dim] = nod;
ordine[++o] = nod;
umap[nod] = dim;
goUp(v, dim, dim);
} else if( op == 2 ) {
//stergem
// for(int j = 1; j <= dim; j++)
// if( v[j] == ordine[nod] ) {
// poz = j;
// break;
// }
v[ umap[ ordine[nod] ] ] = v[dim--];
// if( nod > 1 && v[ umap[ ordine[nod] ] ] < v[ umap[ ordine[nod] ] / 2 ] )
goUp(v, dim, umap[ ordine[nod] ]);
// else {
goDown(v, dim, umap[ ordine[nod] ]);
// }
} else {
//afisam minimul
fout << v[1] << '\n';
}
}
return 0;
}