Mai intai trebuie sa te autentifici.
Cod sursa(job #744564)
Utilizator | Data | 9 mai 2012 02:04:09 | |
---|---|---|---|
Problema | Heapuri | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.04 kb |
#include<cstdio>
#include<algorithm>
using namespace std;
int A[200001], pos[200001], h[200001], n, no;
void Coboara(int i){
int fiu;
while (i <= n/2){
fiu = 2 * i;
if (fiu + 1 <= n && A[pos[fiu+1]] < A[pos[fiu]]) fiu++;
if (A[pos[i]] > A[pos[fiu]]){
swap(h[pos[i]], h[pos[fiu]]);
swap(pos[i], pos[fiu]);
i = fiu;
}
else break;
}
}
void Urca(int i){
int tata = i/2;
while (i > 1 && A[pos[i]] < A[pos[tata]]){
swap(h[pos[i]], h[pos[tata]]);
swap(pos[i], pos[tata]);
i = tata, tata = i/2;
}
}
void Insereaza(int &x){
h[++no] = ++n;
pos[n] = no;
A[no] = x;
Urca(n);
}
void Sterge(int &x){
int i = h[x];
swap(h[pos[n]], h[pos[h[x]]]);
swap(pos[n], pos[h[pos[n]]]);
n--;
Coboara(i);
Urca(i);
}
int main(){
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, cod, x, op;
scanf ("%d", &op);
for (i = 0; i < op; i++){
scanf("%d", &cod);
if (cod == 3) printf("%d\n", A[pos[1]]);
else{
scanf("%d", &x);
if (cod == 1) Insereaza(x);
else Sterge(x);
}
}
return 0;
}