Cod sursa(job #1360159)

Utilizator bogobatBerbece Daniel bogobat Data 25 februarie 2015 12:14:39
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
long n,heap[200009],nr,len;
long pozitie[200009];
long valori[200009];

void sift(int N,int k){
  int son=0;
  while(son != k){

    son=k;
    if(son*2<=N && valori[heap[k]]>valori[heap[son*2]]) k = son*2;
    if(son*2+1 <=N && valori[heap[k]]>valori[heap[son*2+1]])  k=son*2+1;


    swap(heap[k],heap[son]);
    pozitie[heap[k]]=k;
    pozitie[heap[son]]=son;


  }


}
void percolate(int zice,int k){

     int val = heap[k];
    while(k/2 && valori[heap[k/2]]>valori[val] ){
        swap(heap[k],heap[k/2]);
        pozitie[heap[k]]=k;
        pozitie[heap[k/2]]=k/2;
        k/=2;
    }

}

int main()
{   long x;
    int op;
    f>>nr;
    for(int i=1;i<=nr;i++){

        f>>op;
        if(op==1){
            f>>x;
            valori[++n] = x;
            heap[++len]= n;
            pozitie[n]=len;
            percolate(len,len);
        }
        else if(op == 2){
            f>>x;
            valori[x]=-1;
            percolate(len,pozitie[x]);
            pozitie[heap[1]]=0;
            heap[1]=heap[len--];
            pozitie[heap[1]]=1;
            if(len>1) sift(len,1);
        }
        else g<<valori[heap[1]]<<endl;
    }
    f.close();g.close();
    return 0;
}