Mai intai trebuie sa te autentifici.
Cod sursa(job #2890525)
| Utilizator | Data | 15 aprilie 2022 20:39:33 | |
|---|---|---|---|
| Problema | Heapuri | Scor | 20 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 2.04 kb |
#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;
}