Pagini recente » Cod sursa (job #1996176) | Cod sursa (job #2152698) | Cod sursa (job #251752) | Cod sursa (job #2133053) | Cod sursa (job #2263321)
#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--];
coboara(p);
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)
sterge(poz[val]);
}
fclose(fin);
fclose(fout);
return 0;
}