Pagini recente » Borderou de evaluare (job #2247248) | Borderou de evaluare (job #1420105) | Cod sursa (job #43903) | Cod sursa (job #2930608) | Cod sursa (job #2553823)
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 200000;
int h[N+1], v[N+1], poz[N+1];
int nh;
void schimba(int p, int q){
swap(h[p], h[q]);
poz[h[p]] = p;
poz[h[q]] = q;
}
void urca(int p){
while(p>1 && v[h[p]] < v[h[p/2]]){
schimba(p, p/2);
p /= 2;
}
}
void coboara(int p){
int fs = 2*p;
int fd = 2*p+1;
int bun = p;
if(fs <= nh && v[h[fs]] < v[h[bun]])
schimba(fs, bun);
if(fd <= nh && v[h[fd]] < v[h[bun]])
schimba(fd, bun);
if(bun != p){
schimba(p, bun);
coboara(bun);
}
}
void adauga(int x){
h[++nh] = x;
poz[x] = nh;
urca(nh);
}
void sterge(int p){
schimba(p, nh--);
urca(p);
coboara(p);
}
int main()
{
FILE *fin, *fout;
int n,i,op,x,ins;
fin = fopen("heapuri.in","r");
fout = fopen("heapuri.out","w");
fscanf(fin,"%d",&n);
ins = 0;
for(i=1; i<=n; i++){
fscanf(fin,"%d",&op);
if(op == 3)
fprintf(fout,"%d\n",v[h[1]]);
else{
fscanf(fin,"%d",&x);
if(op == 1){
v[++ins] = x;
adauga(ins);
}
else
sterge(poz[x]);
}
}
fclose(fin);
fclose(fout);
return 0;
}