Cod sursa(job #2493100)

Utilizator maria15Maria Dinca maria15 Data 15 noiembrie 2019 22:27:26
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>

using namespace std;

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

int n, a, A, B, op, val[200001], poz[200001], invpoz[200001], p, c, x, m;

int main(){
    fin>>m;
    while(m--){
        fin>>op;
        if(op == 1){   /// se insereaza elementul x in multime
            fin>>x;
            val[++a] = x;       /// valoarea elementului adaugat al a-lea
            poz[++n] = a;       /// pentru elementul aflat pe pozitia n din heap, aflu ce pozitie are el in sirul numerelor adaugate
            invpoz[a] = n;      /// pozitia pe care se afla in heap elementul adaugat al a-lea
            /// INVPOZ ESTE HEAPUL!!!
            c = n;
            p = c/2;
            /// pun elementul nou x la finalul heapului si vad daca trebuie dus mai sus
            while(p != 0 && val[poz[c]] < val[poz[p]]){
                A = poz[c], B = poz[p];
                swap(poz[invpoz[poz[c]]], poz[invpoz[poz[p]]]);
                swap(invpoz[A], invpoz[B]);
                c = p;
                p /= 2;
            }
        }
        if(op == 2){    /// se sterge elementul intrat al x-lea in multime
            fin>>x;
            /// il duc la finalul heapului
            poz[invpoz[x]] = poz[n];
            invpoz[poz[n]] = invpoz[x];
            n--;    /// stergerea
            /// apoi repar stricaciunile
            p = 1;
            c = 2;
            if(val[poz[3]] < val[poz[2]] && 3 <= n)
                c++;
            while(val[poz[p]] > val[poz[c]] && c <= n){
                A = poz[c], B = poz[p];
                swap(poz[c], poz[p]);
                swap(invpoz[A], invpoz[B]);
                p = c;
                c *= 2;
                if(val[poz[c+1]] < val[poz[c]] && c+1 <= n)
                    c++;
            }
        }
        if(op == 3)
            fout<<val[poz[1]]<<"\n";
    }
    return 0;
}