Cod sursa(job #2082066)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 5 decembrie 2017 17:52:31
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
struct element{
int val,poz;

};

int heap[200100];
int pozitii[200100];
int marime_heap;
int min(){
return heap[1];
}
void swap(int x,int y){
int a;
//cout<<heap[x]<<"<->"<<heap[y];
a=heap[x];
heap[x]=heap[y];
heap[y]=a;
pozitii[x]=y;
pozitii[y]=x;


}

void min_heapify(int x){
int minim=x;
int st=2*x;
int dr=2*x+1;
if(st<=marime_heap&&heap[st]<heap[minim])minim=st;
if(dr<=marime_heap&&heap[dr]<heap[minim])minim=dr;
if(minim!=x){
  //  cout<<"AM COBORAT PE"<<x<<endl;
swap(minim,x);
min_heapify(minim);
}
}

void urcare(int x){

int minim=x;
int tata=x/2;
if(x!=1){
if(heap[tata]>heap[x]){
swap(tata,x);
if(tata!=1)
  //  cout<<"AM URCAT PE"<<x<<endl;
urcare(tata);}
}
}
void inserare(element a){
  //  cout<<"AM INSERAT PE "<<a.val<<endl;
    marime_heap++;
heap[marime_heap]=a.val;
pozitii[marime_heap]=marime_heap;
urcare(marime_heap);

}

void stergere(int cron){
   // cout<<"AM STERS PE "<<heap[cron]<<endl;
swap(cron,marime_heap);
pozitii[marime_heap]=0;
marime_heap--;
min_heapify(cron);

}

/*int cautare_dupa_cron(int pozi){
    int i;
    cout<<"AM GASIT POZITIA  ";
for( i=1;i<heap.size();i++)if(heap[i].poz==pozi)break;
cout<<i<<endl;
return i;
}*/


int main()
{element aux;

int j=1;
int poz_sters;
   int nrop;
   int op;
   in>>nrop;
   for(int i=1;i<=nrop;i++){
   in>>op;


   switch(op){
   case 1:{
   in>>aux.val;
   aux.poz=j;
   j++;
  inserare(aux);
   break;
   }

   case 2 :{
   in>>poz_sters;
   stergere(pozitii[poz_sters]);
   break;

   }

   case 3:{
   out<<min()<<'\n';
   break;
   }



   }
/*for(int s=1;s<=marime_heap;s++)cout<<heap[s]<<" ";
cout<<'\n';
for(int s=1;s<=marime_heap;s++)cout<<pozitii[s]<<" ";
cout<<'\n';*/
   }

    return 0;
}