Pagini recente » Cod sursa (job #2292467) | Cod sursa (job #2965715) | Cod sursa (job #2669035) | Cod sursa (job #2517394) | Cod sursa (job #2263354)
#include <bits/stdc++.h>
using namespace std;
int nh=0, y=0;
int v[200001];
int poz[200001], nr[200001];
void swp(int i, int j){
int aux;
aux=v[i];
v[i]=v[j];
v[j]=aux;
poz[v[i]]=i;
poz[v[j]]=j;
}
void urca(int p){
while(p>1 && nr[v[p]]<nr[v[p/2]]){
swp(p, p/2);
p/=2;
}
}
void coboara(int p){
int fs=p*2, fd=p*2+1, bun=p;
if(fs<=nh && nr[v[fs]]<nr[v[bun]])
bun=fs;
if(fd<=nh && nr[v[fd]]<nr[v[bun]])
bun=fd;
if(bun!=p){
swp(p, bun);
coboara(bun);
}
}
void adauga(int x){
v[++nh]=x;
poz[x]=nh;
urca(nh);
}
void sterge(int p){
if(p==nh){
nh--;
return;
}
v[p]=v[nh--];
int cp = p;
coboara(cp);
urca(p);
}
int main(){
FILE *fin, *fout;
int n, i, caz, val;
fin=fopen("heapuri.in", "r");
fout=fopen("heapuri.out", "w");
fscanf(fin, "%d", &n);
for(i=1;i<=n;i++){
fscanf(fin, "%d", &caz);
if(caz!=3)
fscanf(fin, "%d", &val);
else
fprintf(fout, "%d\n", nr[v[1]]);
if(caz==1){
nr[++y]=val;
adauga(y);
}
if(caz==2) {
//fprintf(fout, "sterg (%d, %d)\n", val, nr[val]);
sterge(poz[val]);
//fprintf(fout, "ultim = (%d, %d)\n", v[nh], nr[v[nh]]);
}
}
fclose(fin);
fclose(fout);
return 0;
}