Cod sursa(job #1397737)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 23 martie 2015 18:41:06
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<fstream>
using namespace std;
int n, m, i, p, c, x, t, k;
int v[200001], poz[200001], w[200001];
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int main(){
    fin>> n;
    for(; n; n--){
        fin>> t;
        if(t == 3){
            fout<< w[v[1]] <<"\n";
        }
        else{
            if(t == 1){
                fin>> x;
                k++;
                v[++m] = k;
                poz[k] = m;
                w[k] = x;
                c = m;
                p = m / 2;
                while(p > 0){
                    if(w[v[p]] > w[v[c]]){
                       swap(v[p], v[c]);
                       poz[ v[p] ] = p;
                       poz[v[c]] = c;
                       c = p;
                       p = c / 2;
                    }
                    else{
                        break;
                    }
                }
            }
            else{
                fin>> x;
                w[v[poz[x]]] = -1000000000;
                c = poz[x];
                p = c / 2;
                while(p > 0){
                     if(w[v[p]] > w[v[c]]){
                       swap(v[p], v[c]);
                       poz[ v[p] ] = p;
                       poz[v[c]] = c;
                       c = p;
                       p = c / 2;
                    }
                    else{
                        break;
                    }
                }
                v[1] = v[m];
                poz[v[m]] = 1;
                m--;
                p = 1;
                c = 2;
                while(c <= m){
                    if(c < m && w[v[c+1]] < w[v[c]]){
                        c++;
                    }
                    if(w[v[p]] > w[v[c]]){
                       swap(v[p], v[c]);
                       poz[ v[p] ] = p;
                       poz[v[c]] = c;
                       p = c;
                       c = 2 * p;
                    }
                    else{
                        break;
                    }
                }
            }
        }

    }
    return 0;
}