Cod sursa(job #1816261)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 26 noiembrie 2016 12:08:14
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>

using namespace std;
int v[200001],poz[200001],i,j,n,k,k2,c,p,x,nr,w[200001];
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");

int main (){

    fin>>n;
    for (i=1;i<=n;i++){
        fin>>nr;
        if (nr == 1){
            // adaugam elemtul x in multime
            fin>>w[i]; // elementele introduse, in ordine

            v[++k] = w[i];

            c = k;
            p = c/2;
            poz[++k2] = c;
            while (v[c] < v[p]){
                swap (v[c],v[p]);
                //poz[c] = p;
                //poz[p] = c;
                poz[p] = c;
                poz[k] = p;
               // swap (poz[c],poz[p]);
                c = p;
                p /= 2;
            }
            // pozitia pe care se gaseste al i-lea element intrat in multime, din v
            //v[k2].s = c;
        }
        if (nr == 2){
            // stergem al x lea elemt intrat in multime
            fin>>x;
            v[poz[x]] = v[k];
            //poz[x] = k;//****************
            //poz[k] = poz[x];
            k--;
            // refacem heapul si pozitiile
            p = poz[x];
            c = 2*p;
            while (c <= k){
                if (c+1 <= k && v[c+1] < v[c])
                    c++;
                if (v[p] > v[c]){
                    swap (v[p],v[c]);
                    poz[p] = c;
                    poz[x] = p;
                    //swap (poz[p],poz[c]);
                    p = c;
                    c = 2*c;
                }
                else
                    break;
            }
        }
        if (nr == 3){
            fout<<v[1]<<"\n";
        }
    }




    return 0;
}