Pagini recente » Cod sursa (job #2975228) | Cod sursa (job #553299) | Cod sursa (job #2072309) | Cod sursa (job #2306848) | Cod sursa (job #825362)
Cod sursa(job #825362)
#include<fstream>
using namespace std;
int heap[200000],poz[200000];
int tata(int n){
return n/2;}
int fiust(int n){
return 2*n;}
int fiudr(int n){
return 2*n+1;}
int minim(){
return heap[1];}
void cerne(int n, int k){
int fiu;
do{
fiu=0;
if(fiust(k)<=n){
fiu=fiust(k);
if((fiudr(k)<=n)&&(heap[fiudr(k)]<heap[fiust(k)]))fiu=fiudr(k);
if(heap[fiu]>=heap[k])
fiu=0;}
if (fiu) {
swap(heap[k], heap[fiu]);
k=fiu;}
} while (fiu);
}
void interclaseaza(int n,int k){
int aux;
aux=heap[k];
while((k>1)&&(aux<heap[tata(k)]))
{ heap[k]=heap[tata(k)];
k=tata(k);
}
heap[k]=aux;
}
void eliminare(int &n, int k){
heap[k]=heap[n];
n--;
if((k>1)&&(heap[k]<heap[tata(k)]))
interclaseaza(n, k);
else cerne(n,k);
}
void introducere(int &n, int element){
heap[++n]=element;
interclaseaza(n,n);
}
int cautare(int n, int p){
int i,x=poz[p];
for(i=1;i<=n;i++)
if(heap[i]==x) return i;}
int main(){
int i,x,y,nrop,n=0,k=0;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
f>>nrop;
for(i=1;i<=nrop;i++){
f>>x;
if(x==1){
f>>y;
poz[++k]=y;
introducere(n,y);}
else if(x==2){
f>>y;
eliminare(n,cautare(n,y));}
else g<<minim()<<'\n';
}
f.close();
g.close();
}