Cod sursa(job #2894069)

Utilizator iulia.talpalariuIulia-Georgiana Talpalariu iulia.talpalariu Data 27 aprilie 2022 11:04:27
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <fstream>

int v[200003];
int heap[200003]; // heapul va avea pozitiile din v
int poz[200003];//va tine pe ce poz in heap se afla un element de pe o an poz in v
int m = 0; // pozitiile pe care sunt introduse elemente in v, poz
int k = 0; // pozitia pe care adaug acuma element in k

void urca(int x) {

	while (x/2 && v[heap[x]] < v[heap[x/2]]) {
        //cand gasesc un stramos mai mare decat mine interschimb cu mn
	    heap[x] = heap [x] ^ heap[x/2];
        heap[x/2] = heap [x] ^ heap[x/2];
        heap[x] = heap [x] ^ heap[x/2];

		poz[heap[x]] = x;
		poz[heap[x/2]] = x/2;
		x = x/2;
	}
}
void inserare(int elem) {

    k++;
    m++;
    v[m] = elem;
    heap[k] = m;
    poz[m] = k;
    urca(k);

}

void coboara(int pozitie) {
    int minim = pozitie;
    int st = pozitie << 1;
    int dr = (pozitie << 1) +1;

    if ( st <= k && v[heap[st]] < v[heap[pozitie]]) {
        minim = st;
    }
    if ( dr <= k && v[heap[dr]] < v[heap[minim]]) {
        minim = dr;
    }

    if (minim != pozitie) {
        heap[minim] = heap [minim] ^ heap[pozitie];
        heap[pozitie] = heap [minim] ^ heap[pozitie];
        heap[minim] = heap [minim] ^ heap[pozitie];

        poz[heap[pozitie]] = pozitie;
        poz[heap[minim]] = minim;
        coboara(minim);
    }
}
void eliminare(int p) {
    //p pozitia in v --> tb sa scot elem din heap cu pozitia poz[p]

    heap[poz[p]] = heap[k];
    poz[heap[poz[p]]] = poz[p];
    k = k - 1 ;
    urca(poz[p]);
    coboara(poz[p]);

}

int main() {
int n, operatie;
int x;


    std::ifstream fileIn("heapuri.in");
    std::ofstream fileOut("heapuri.out");

    fileIn >> n; //nr operatii citite in continuare;

    for( int j = 0; j < n; j++ ) {
        fileIn >> operatie;
        switch(operatie) {
            case 1: {
                fileIn >> x;
                inserare(x);
                break;
                }
            case 2: {
                fileIn >> x;
                eliminare(x);
                break;
            }
            case 3:
                {
                    fileOut << v[heap[1]] << "\n";
                    break;
                }
        }
    }

    return 0;

}