Pagini recente » Cod sursa (job #1390947) | Cod sursa (job #703341) | Cod sursa (job #2419418) | Cod sursa (job #683883) | Cod sursa (job #2442987)
#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];
/// fie i: tatal lui i este i/2
/// fie i: fiul stang al lui este i*2, iar cel drept i*2+1
/// in v tin valorile initiale, in ordinea lor
/// in heap tin valorile "sortate"
/// caut minimul, acesta este mereu in heap[1]
void VerificaTatii(int poz){
int valoare=heap[poz];
while(poz>1 && valoare<heap[poz/2]){
heap[poz]=heap[poz/2];
poz=poz/2;
}
heap[poz]=valoare;
}
int PozitiaInHeap(int valoare){
for(int i=1; i<=NumereInHeap; i++){
if(heap[i]==valoare){
return i;
}
}
return -1;
}
void VerificaFii(int poz){
int ok=1;
while(ok==1){
ok=0;
if(poz*2<=NumereInHeap && heap[poz]>heap[poz*2] && (poz*2+1>NumereInHeap || heap[poz*2]<heap[poz*2+1]) ){
/// Fiul din stanga
ok=1;
swap(heap[poz], heap[poz*2]);
poz=poz*2;
}else{
if(poz*2+1<=NumereInHeap && heap[poz]>heap[poz*2+1]){
/// Fiul din dreapta
ok=1;
swap(heap[poz], heap[poz*2+1]);
poz=poz*2+1;
}
}
}
}
void sterge(int poz){
heap[poz]=heap[NumereInHeap];
NumereInHeap--;
if(poz>1 && heap[poz]<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<<heap[1]<<"\n";
}
if(t==1){
n++;
fin>>v[n];
NumereInHeap++;
heap[NumereInHeap]=v[n];
VerificaTatii(NumereInHeap);
}
if(t==2){
int PozitiaInVector;
fin>>PozitiaInVector;
val=v[PozitiaInVector];
int poz=PozitiaInHeap(val);
if(poz>0){
sterge(poz);
}
}
}
}