Cod sursa(job #337283)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 3 august 2009 11:16:56
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
using namespace std;
int heap[2*200000+1],n,i,j,l,r,lheap,poz[200001],poz2[200001],nrcr,x;
int left(int i)
 {return 2*i;}
 int right (int i)
 {return 2*i+1;}
 int parent(int i)
 {return i/2;}
void minheapify(int i)
{if(i<lheap )
 {int min=i;
  if(2*i<=lheap) {l=left(i);
                  if(l<min) min=l;
                  if((2*i+1<=lheap)) {r=right(i);} if(r<min) min=r;}
    if(min!=i) {int aux=heap[i];heap[i]=heap[min];heap[min]=aux; int aux2=poz2[min];poz2[min]=poz2[i];poz2[i]=aux2;poz[poz2[min]]=min;poz[poz2[i]]=i;minheapify(min);}
            
            }
    
    }
void add(int val)
{heap[++lheap]=val;
nrcr++;
poz2[lheap]=nrcr;
poz[nrcr]=lheap;
i=lheap/2;int curent=lheap;
while(i!=0 && heap[curent]<heap[i]){int aux=heap[i];heap[i]=heap[curent];heap[curent]=aux; 
          int aux2=poz2[curent];poz2[curent]=poz2[i];poz2[i]=aux2;poz[poz2[curent]]=curent;poz[poz2[i]]=i;curent=i;i=i/2;}
    
    }
    
void hdelete(int i)
{int nod=poz2[i];
heap[nod]=heap[lheap];lheap--;
minheapify(nod);
     
     
     }    


int main()
{freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int m,cerinta;
scanf("%d ",&m);
nrcr=0;
lheap=0;
for(;m;m--)
 {scanf("%d",&cerinta);
   switch(cerinta)
   { case 3 : {printf("%d \n",heap[1]); break;}
    case 1 : {scanf("%d",&x); add(x); break; }
    case 2 :{scanf("%d",&x); hdelete(x); break;}
    default : break;}
    
           
           
           }
return 0;
}