Pagini recente » Cod sursa (job #172434) | Cod sursa (job #224071) | Cod sursa (job #549522) | Cod sursa (job #3285686) | Cod sursa (job #2773882)
#include<iostream>
#include <bits/stdc++.h>
#include<fstream>
using namespace std;
vector <int> h; //construim heap sub forma de vector de numere intregi
int mini,pm;
void reheapup(int p) //functie pentru repararea heap-ului care urca elementul pe pozitia corecta
{
while(p)
{
int tata=(p-1)/2;
if(h[tata]<h[p])
{
swap(h[tata],h[p]);
p=tata;
}
else{
break;
}
}
}
void reheapdown(int p)//functie pentru coborarea radacinii catre pozitia corecta in heap
{
if(p*2+1 >= (int)h.size())
return;
int st = h[p*2+1]; int dr = h[p*2+2];
if( ((p*2+2)==(int)h.size()) || st>dr )
{
if(st > h[p])
{
swap(h[p], h[p*2+1]);
reheapdown(p*2+1);
return;
}
else{
return;
}
}
else
{
if(dr>h[p])
{
swap(h[p],h[p*2+2]);
reheapdown(p*2+2);
return;
}
else{
return;
}
}
}
void insertion(int x) //functie inserare
{
h.push_back(x);
reheapup(h.size()-1);
}
void build(int n, int v[]) //functie construire heap
{
for(int i=0; i<n; i++)
insertion(v[i]);
}
void afisare() //functie afisare heap
{
cout<<endl;
for(int i=0;i<(int)h.size();i++)
cout<<h[i]<<' ';
cout<<endl;
}
void sterge(int i) //functie stergere element pozitia i
{
h[i] = h[h.size()-1];
h.pop_back();
reheapdown(i);
reheapup(i);
}
void fmini(int &mini) //functie gasire minim
{
if((int)h.size()==0)
mini=-1;
else
{
mini= h[h.size()-1];
for(int i=h.size()-2;i>=(int)h.size()/2;i--)
{
if(h[i]<mini)
{
mini=h[i];
}
}
}
}
void dmini(int &mini,int &pm) //functie stergere minim
{
if((int)h.size()==0)
mini=-1;
else
{
mini= h[h.size()-1];
for(int i=h.size()-2;i>=(int)h.size()/2;i--)
{
if(h[i]<mini)
{
mini=h[i];
pm=i;
}
}
}
//cout<<"minim= "<<mini<<endl<<"pozitia este= "<<pm<<endl;
sterge(pm);
return;
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int N,x,cod,mini;
f>>N;
for(int i=1; i<=N; i++)
{
f>>cod;
if(cod!=3)
f>>x;
switch(cod)
{
case 1:
{
insertion(x);
}
break;
case 2:
sterge(x);
break;
case 3:
{
fmini(mini);
g<<mini<<'\n';
}
break;
}
}
}