Cod sursa(job #1384218)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 10 martie 2015 22:46:02
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#define DIM 200010
using namespace std;

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

int N, Q, i, j, k, ok, c, cod;
int V[DIM], W[DIM], x, p, val;
int F[DIM], aux, nr;

void swap(int a, int b){
     aux = V[a]; V[a] = V[b]; V[b] = aux;
     aux = W[a]; W[a] = W[b]; W[b] = aux;
}

void Shift(int c){
     p = c / 2;
     while(p != 0){
          if(V[p] > V[c]){
               swap(p, c);
               F[W[c]] = c;
               c = p; p /= 2;
          }
          else
               break;
     }
     F[W[c]] = c;
     return;
}

void Percolate(int p){
     c = p * 2;
     while(c <= N){
          if(c + 1 <= N && V[c] > V[c+1])
               c ++;
          if(V[p] > V[c]){
               swap(p, c);
               F[W[p]] = p;
               p = c; c *= 2;
          }
          else
               break;
     }
     F[W[p]] = p;
     return;
}

void Heap_Expert(){
     fin >> Q;
     for(k = 1; k <= Q; k ++){
          fin >> cod;
          if(cod == 1){
               fin >> x;
               N ++;
               V[N] = x;
               W[N] = ++nr;
               Shift(N);
          }
          if(cod == 2){
               fin >> x;
               val = F[x];
               F[W[val]] = 0;
               swap(val, N);
               V[N] = W[N] = 0;
               F[W[val]] = val;
               N --;
               if(V[val/2] > V[val])
                    Shift(val);
               else
                    Percolate(val);
          }
          if(cod == 3)
               fout << V[1] << "\n";
     }
     return;
}

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