Pagini recente » Borderou de evaluare (job #2513430) | Borderou de evaluare (job #1430610) | Borderou de evaluare (job #345630) | Borderou de evaluare (job #1010554) | Cod sursa (job #3332575)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct node {
int nr;
int id;
};
bool deleted[int(2e5) + 5] = {0};
node hp[int(9e5) + 5] = {0};
void addHeap(int pos) {
if (hp[pos].nr < hp[pos / 2].nr && (pos / 2) >= 1) {
swap(hp[pos], hp[pos / 2]);
addHeap(pos / 2);
}
}
void removeTop(int pos) {
//
// fout << hp[pos].nr << " " << hp[pos].id << '\n';
// fout << hp[2 * pos].nr << " " << hp[2 * pos].id << '\n';
// fout << hp[2 * pos + 1].nr << " " << hp[2 * pos + 1].id << '\n';
// fout << '\n';
if (hp[2 * pos].nr == 0 && hp[2 * pos + 1].nr == 0) {
hp[pos].nr = 0;
hp[pos].id = 0;
return;
} else if (hp[2 * pos].nr == 0 && hp[2 * pos + 1].nr != 0) {
swap(hp[pos], hp[2 * pos + 1]);
removeTop(2 * pos + 1);
return;
} else if (hp[2 * pos].nr != 0 && hp[2 * pos + 1].nr == 0) {
swap(hp[pos], hp[2 * pos]);
removeTop(2 * pos);
return;
}
if (hp[2 * pos].nr <= hp[2 * pos + 1].nr) {
swap(hp[pos], hp[2 * pos]);
removeTop(2 * pos);
return;
} else if (hp[2 * pos].nr >= hp[2 * pos + 1].nr) {
swap(hp[pos], hp[2 * pos + 1]);
removeTop(2 * pos + 1);
return;
}
}
int main() {
int currNodes = 0;
int m;
fin >> m;
for (int i = 1; i <= m; i++) {
int op;
fin >> op;
if (op == 1) {
int nr;
fin >> nr;
currNodes++;
hp[currNodes].nr = nr;
hp[currNodes].id = currNodes;
addHeap(currNodes);
} else if (op == 3) {
int temp_id;
while (deleted[hp[1].id] == true) {
temp_id = hp[1].id;
removeTop(1);
deleted[temp_id] = false;
}
fout << hp[1].nr << '\n';
} else if (op == 2) {
int pos;
fin >> pos;
deleted[pos] = true;
}
}
return 0;
}