Pagini recente » Cod sursa (job #1259891) | Cod sursa (job #1217769) | Cod sursa (job #1201095) | Cod sursa (job #869891) | Cod sursa (job #2894069)
#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;
}