Cod sursa(job #1355494)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 22 februarie 2015 19:22:00
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include <fstream>
#define DIM 400010
using namespace std;

ifstream fin ("heapuri.in" );
ofstream fout("heapuri.out");

int N, M, i, j, k, val, cod;
int Heap[DIM], Frec[DIM];
int aux, d;

int cond_1(){return cod == 1;}
int cond_2(){return cod == 2;}
int cond_3(){return cod == 3;}

void Find(){
     i = 1;
     while(Frec[i] != val)
          i ++;
     return;
}

void Percolate(int val){
     while((val > 1) && (Heap[val] < Heap[val/2])){
          aux = Heap[val]; Heap[val] = Heap[val/2]; Heap[val/2] = aux;
          aux = Frec[val]; Frec[val] = Frec[val/2]; Frec[val/2] = aux;
          val /= 2;
     }
     return;
}

void Shift(int val){
     if(Heap[val*2] == 0)
          return;
     if(Heap[val*2+1] == 0 && Heap[val*2] != 0)
          if(Heap[val] > Heap[val*2]){
               aux = Heap[val]; Heap[val] = Heap[val*2]; Heap[val*2] = aux;
               aux = Frec[val]; Frec[val] = Frec[val*2]; Frec[val*2] = aux;
               return;
          }
     if(Heap[val*2+1] != 0){
          if(Heap[val*2] < Heap[val*2+1] && Heap[val] > Heap[val*2+1]){
               aux = Heap[val]; Heap[val] = Heap[val*2+1]; Heap[val*2+1] = aux;
               aux = Frec[val]; Frec[val] = Frec[val*2+1]; Frec[val*2+1] = aux;
               val = val * 2 + 1;
               Shift(val);
               return;
          }
          if(Heap[val*2] > Heap[val*2+1] && Heap[val] > Heap[val*2+0]){
               aux = Heap[val]; Heap[val] = Heap[val*2+0]; Heap[val*2+0] = aux;
               aux = Frec[val]; Frec[val] = Frec[val*2+0]; Frec[val*2+0] = aux;
               val = val * 2 + 0;
               Shift(val);
               return;
          }
     }
     return;
}

void Build_Heap(){
     fin >> N;
     for(k = 1; k <= N; k ++){
          fin >> cod;
          if(cond_1()){
               fin >> val; d ++;
               Heap[d] = val;
               Frec[d] = d;
               Percolate(d);
          }
          if(cond_2()){
               fin >> val;Find();
               Heap[i] = Heap[d]; Heap[d] = 0;
               Frec[i] = Frec[d]; Frec[d] = 0;
               d --;
               Percolate(i);
               Shift(i);
          }
          if(cond_3()){
               fout << Heap[1];
               fout << "\n";
          }
     }
     return;
}

int main(){
     Build_Heap();
     return 0;
}