Cod sursa(job #333048)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 21 iulie 2009 12:49:55
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<cstdio>
using namespace std;

int a[200001],heapsize,n,x,y,cron[200001],gasit,cr;

int left(int i)
{return 2*i;}

int right (int i)
{return 2*i+1;}

int tata(int i)
{return i/2;}

void minHeapify(int i)
{if(i<heapsize && heapsize>1)
     {int minim,l,r;
l=left(i);
r=right(i);
if(l<=heapsize){
if(a[i]>a[r] && r<=heapsize) minim=r;
else minim=i;
if(a[minim]>a[l]) minim=l;
if(i!=minim) {int aux;aux=a[i];a[i]=a[minim];a[minim]=aux;minHeapify(minim);}}}}

void insert(int val)
{heapsize++;
a[heapsize]=val;
if(heapsize>1){
int i=heapsize;
while(i>1 && a[i]<a[tata(i)])
 {int aux;aux=a[i];a[i]=a[tata(i)];a[tata(i)]=aux;
 i=tata(i);}  }
   /*  for(int k=1;k<=heapsize;k++) printf("%d ", a[k]);
printf("\n"); */
     }  
        
 int minim()
  {return a[1];}
  
void cautareHeap(int in,int sf,int val,int &gasit,int &poz)
{if(in<sf) 
 {int mij=in+((sf-in)/2);
 if(a[mij]==val) {gasit=1;poz=mij;return;}
 else {cautareHeap(in,mij,val,gasit,poz);
       cautareHeap(mij+1,sf,val,gasit,poz);}
 }
 
    }
void deleteHeap(int x)
{int val=cron[x];


 gasit=0;
int poz=1;cautareHeap(1,heapsize,val,gasit,poz);

for(int j=x;j<cr;j++)
 cron[j]=cron[j+1];
 cr--;
int aux1=a[poz];a[poz]=a[heapsize];a[heapsize]=aux1;heapsize--;
//printf("%d ", a[poz]);
minHeapify(poz); 
/*for(int k=1;k<=heapsize+1;k++) printf("%d ", a[k]);
printf("\n"); */
     }      
     
int main()
{freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int m,val;heapsize=0;cr=0;
 scanf("%d",&m);
 for(;m;m--)
 {scanf("%d",&x);
   if(x==1) {scanf("%d",&val); cr++;cron[cr]=val;insert(val);}
   else if(x==2) {scanf("%d",&x);deleteHeap(x);}
         else printf("%d \n",a[1]);
            
            }   
    return 0;
    }