Pagini recente » Cod sursa (job #2769090) | Cod sursa (job #360212) | Cod sursa (job #1038177) | Cod sursa (job #2549995) | Cod sursa (job #407094)
Cod sursa(job #407094)
#include <stdio.h>
#include <algorithm>
#define INF 1<<30
#define Nmax 200010
using namespace std;
int H[Nmax], nr[Nmax];
int i, j, q, x, t, c, n, aux, niv;
void UP(int i){
t = i/2;
c = i;
aux = H[c];
while (H[t] > aux && t > 0){
H[c] = H[t];
c = t;
t = c/2;
}
H[c] = aux;
}
int DOWN(int i, int n){
c = 2*i;
t = i;
while ((H[t] > H[c] && c <= n) || (H[t] > H[c+1] && c+1 <= n)){
if (H[c + 1] < H[c] && (c + 1) <= n)
c = c + 1;
aux = H[t];
H[t] = H[c];
H[c] = aux;
t = c;
c = 2*t;
}
}
int FIND (int x){
for (j = 1 ; j <= n ; j++)
if (x == H[j])
return j;
}
int main (){
FILE * f = fopen ("heapuri.in", "r");
FILE * g = fopen ("heapuri.out", "w");
fscanf (f, "%d", &n);
niv = 0;
for (i = 1 ; i <= n ; i++){
fscanf (f, "%d", &q);
if (q == 1){
fscanf(f, "%d", &x);
nr[++niv] = x;
H[niv] = x;
UP(niv);
}
if (q == 2){
fscanf (f, "%d", &x);
x = nr[x];
x = FIND (x);
H[x] = H[niv];
t = x/2;
c = x;
if (H[c] < H[t])
UP(c);
t = x;
c = 2*x;
if ((H[t] > H[c] && c <= niv) || (H[t] > H[c+1] && c+1 <= niv)){
if (c+1 > i)
H[c+1] = INF;
DOWN(x,niv);
}
}
if (q == 3)
fprintf (g, "%d\n", H[1]);
}
fclose(g);
fclose(f);
return 0;
}