Pagini recente » Cod sursa (job #837064) | Cod sursa (job #829540) | Cod sursa (job #786564) | Cod sursa (job #1574138) | Cod sursa (job #2894976)
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout("heapuri.out");
int v[200005], H[200005],N;
unordered_map <int,int> poz;
void inserare(int x){
H[++N]=x;
poz[x]=N;
while(x<H[poz[x]/2] && poz[x]>1){
H[poz[x]]=H[poz[x]/2];
poz[H[poz[x]]]=poz[x];
poz[x]/=2;
}
H[poz[x]]=x;
}
void stergere(int x){
H[poz[x]]=H[N];
poz[H[poz[x]]]=poz[x];
N--;
int pozitie=poz[x];
if(H[pozitie]<H[pozitie/2]){
//urcare
while(H[pozitie]<H[pozitie/2] && pozitie>1){
H[pozitie]=H[pozitie/2];
poz[H[pozitie]]=pozitie;
pozitie/=2;
}
H[pozitie]=H[N+1];
poz[H[pozitie]]=pozitie;
}
else{
while(H[pozitie]>min(H[pozitie*2], H[pozitie*2+1]) && (pozitie*2+1)<=N){
if(H[pozitie*2]<=H[pozitie*2+1]){
int aux=H[pozitie];
H[pozitie]=H[pozitie*2];
H[pozitie*2]=aux;
poz[H[pozitie]]=pozitie;
poz[H[pozitie*2]]=pozitie*2;
pozitie*=2;
}
else{
int aux=H[pozitie];
H[pozitie]=H[pozitie*2+1];
H[pozitie*2+1]=aux;
poz[H[pozitie]]=pozitie;
poz[H[pozitie*2]]=pozitie*2;
pozitie=pozitie*2+1;
}
}
if(pozitie*2==N && H[pozitie]>H[pozitie*2])
{
H[pozitie]=H[pozitie*2];
poz[H[pozitie]]=pozitie;
pozitie*=2;
}
H[pozitie]=H[N+1];
poz[H[pozitie]]=pozitie;
}
}
int main() {
int n,i,op,x;
fin>>n;
while(n--){
fin>>op;
if(op==1){
i++;
fin>>x;
v[i]=x;
inserare(x);
}
else if(op==2){
fin>>x;
stergere(v[x]);
}
else
fout<<H[1]<<'\n';
}
return 0;
}