Cod sursa(job #769107)

Utilizator ion824Ion Ureche ion824 Data 18 iulie 2012 12:20:43
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>
using namespace std;
const int NM = 200005;
int v[NM],h[NM],poz[NM],hp,n;

inline void swap(int &a,int &b){ int k=a; a=b; b=k; }
       
void upheap(int k){    
     while(k>1 && v[h[k]]<v[h[k/2]])
       {
        swap(poz[h[k]],poz[h[k/2]]);
        swap(h[k],h[k/2]);
        k/=2;
     }
}  

void downheap(int k){
     int nod=1;
     while(nod)
     {
      nod=0;
      if(2*k<=hp)
        {
         nod=2*k;
         if(2*k+1<=hp && v[h[nod]]>v[h[nod+1]])++nod;
         if(v[h[nod]]>=v[h[k]]) nod=0;         
        }          
      if(nod)
        {
          swap(poz[h[nod]],poz[h[k]]);
          swap(h[nod],h[k]);
          k=nod;         
        }              
     }
}
  
void insert(int k){
     v[++n]=k; h[++hp]=n; poz[n]=hp;
     upheap(hp);
}   
     
void del(int k){
     poz[h[hp]]=k; swap(h[k],h[hp]); --hp;
     if(k>1 && v[h[k]]<v[h[k/2]])upheap(k);
       else downheap(k);
}

int main(void){
    ifstream fin("heapuri.in");
    ofstream fout("heapuri.out");
    int i,M,op,x;
    for(i=1,fin>>M;i<=M;++i)
    {
     fin>>op;
     if(op==1){ fin>>x; insert(x); }
     if(op==2){ fin>>x; del(poz[x]); }
     if(op==3)fout<<v[h[1]]<<'\n';                                                    
    }  
 return 0;   
}