Pagini recente » Cod sursa (job #1994617) | Cod sursa (job #238058) | Cod sursa (job #2285274) | Cod sursa (job #2273347) | Cod sursa (job #2493225)
#include <fstream>
#include <bitset>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, NumereInHeap, operatii, t, val, heap[200005], v[200005], PozitiaInHeap[200005];
void VerificaTatii(int poz){
int valoare=heap[poz];
while(poz>1 && v[valoare]<v[heap[poz/2]]){
swap(heap[poz], heap[poz/2]);
PozitiaInHeap[ heap[poz] ] = poz;
PozitiaInHeap[ heap[poz/2] ] = poz/2;
poz=poz/2;
}
}
void VerificaFii(int poz){
int ok=1;
while(ok==1){
ok=0;
if(poz*2<=NumereInHeap && v[heap[poz]]>v[heap[poz*2]] &&
(poz*2+1>NumereInHeap || v[heap[poz*2]]<v[heap[poz*2+1]]) ){
ok=1;
swap(heap[poz], heap[poz*2]);
PozitiaInHeap[ heap[poz] ] = poz;
PozitiaInHeap[ heap[poz*2] ] =poz*2;
poz=poz*2;
}else{
if(poz*2+1<=NumereInHeap && v[heap[poz]]>v[heap[poz*2+1]]){
ok=1;
swap(heap[poz], heap[poz*2+1]);
PozitiaInHeap[ heap[poz] ] = poz;
PozitiaInHeap[ heap[poz*2+1] ] =poz*2+1;
poz=poz*2+1;
}
}
}
}
void sterge(int poz){
heap[poz]=heap[NumereInHeap];
PozitiaInHeap[ heap[poz] ] = poz;
NumereInHeap--;
if(poz>1 && v[heap[poz]]<v[heap[poz/2]]){
VerificaTatii(poz);
}else{
VerificaFii(poz);
}
}
int main(){
fin>>operatii;
for(int aux=1; aux<=operatii; aux++){
fin>>t;
if(t==3){
fout<<v[heap[1]]<<"\n";
}
if(t==1){
n++;
fin>>v[n];
NumereInHeap++;
heap[NumereInHeap]=n;
PozitiaInHeap[n]=NumereInHeap;
VerificaTatii(NumereInHeap);
}
if(t==2){
int PozitiaInVector;
fin>>PozitiaInVector;
val=v[PozitiaInVector];
int poz=PozitiaInHeap[PozitiaInVector];
if(poz>0){
sterge(poz);
}
}
}
}