Pagini recente » Cod sursa (job #148461) | Cod sursa (job #953775) | Cod sursa (job #1389159) | Cod sursa (job #3271785) | Cod sursa (job #651710)
Cod sursa(job #651710)
#include<stdio.h>
#include<algorithm>
#define lim 200001
FILE * f=fopen("heapuri.in","r");
FILE * g=fopen("heapuri.out","w");
using namespace std;
int A[lim], pos[lim], h[lim];
int n, no;
void schimba(int &x, int &y){
int aux;aux = y; y = x; x = aux;
}
void down(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]]){
schimba(h[pos[i]], h[pos[fiu]]);
schimba(pos[i], pos[fiu]);
i = fiu;
}
else break;
}
}
void up(int i){
int tata = i/2;
while (i > 1 && A[pos[i]] < A[pos[tata]]){
schimba(h[pos[i]], h[pos[tata]]);
schimba(pos[i], pos[tata]);
i = tata; tata = i/2;
}
}
void insert(int &x){
h[++no] = ++n;
pos[n] = no;
A[no] = x;
up(n);
}
void erase(int &x){
int i = h[x];
schimba(h[pos[n]], h[pos[h[x]]]);
schimba(pos[n], pos[h[pos[n]]]);
n--;
down(i);
up(i);
}
int main(){
int i, cod, x, op;
fscanf(f,"%d",&op);
for (i = 0; i < op; i++){
fscanf(f,"%d", &cod);
if (cod == 3) fprintf(g,"%d\n", A[pos[1]]);
else{
fscanf(f,"%d", &x);
if (cod == 1) insert(x);
else erase(x);
}
}
fclose(f);
fclose(g);
return 0;
}