Cod sursa(job #2493115)

Utilizator maria15Maria Dinca maria15 Data 15 noiembrie 2019 22:43:28
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.55 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[c], 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
            /// elementul de la finalul heapului a ajuns mai sus in heap
            /// trebuie sa vad daca il duc in sus sau in jos
            /// mai intai, presupun ca il duc in jos
            p = invpoz[x];
            c = 2*p;
            if(val[poz[c+1]] < val[poz[c]] && c+1 <= n)
                c++;
            if(val[poz[p]] > val[poz[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++;
                }
            }
            else{   /// incerc acum sa il duc in sus
                c = invpoz[x];
                p = c/2;
                while(val[poz[c]] < val[poz[p]] && p != 0){
                    A = poz[c], B = poz[p];
                    swap(poz[c], poz[p]);
                    swap(invpoz[A], invpoz[B]);
                    c = p;
                    p /= 2;
                }
            }
        }
        if(op == 3){
            fout<<val[poz[1]]<<"\n";
        }
    }
    return 0;
}