Pagini recente » Cod sursa (job #260521) | Cod sursa (job #2275385) | Cod sursa (job #2728259) | Cod sursa (job #684964) | Cod sursa (job #3123630)
#include <iostream>
#include <vector>
#include <map>
#include <cstring>
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
#include <set>
#include <unordered_map>
#include <stack>
#include <iomanip>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
const int MAX = 200001;
int parent(int index) {
return (index - 1) / 2;
}
int leftChild(int index) {
return index * 2 + 1;
}
int rightChild(int index) {
return index * 2 + 2;
}
void insert(vector<int> &heap, int value) {
if ((int) heap.size() == 0) {
heap.push_back(value);
return;
}
heap.push_back(value);
int child = (int) heap.size() - 1;
int parentIndex = parent(child);
while (child > 0 && heap[child] < heap[parentIndex]) {
swap(heap[child], heap[parentIndex]);
child = parentIndex;
parentIndex = parent(child);
}
}
void deleteValue(vector<int> &heap, int value) {
int index = -1;
for (int i = 0; i < (int) heap.size(); ++i) {
if (heap[i] == value) {
index = i;
break;
}
}
if (index == -1) {
return;
}
swap(heap[index], heap[(int) heap.size() - 1]);
heap.pop_back();
while (index < (int) heap.size()) {
int nextIndex = index;
if (leftChild(index) < (int) heap.size() && heap[leftChild(index)] < heap[nextIndex]) {
nextIndex = leftChild(index);
}
if (rightChild(index) < (int) heap.size() && heap[rightChild(index)] < heap[nextIndex]) {
nextIndex = rightChild(index);
}
if (nextIndex == index) {
break;
}
swap(heap[index], heap[nextIndex]);
index = nextIndex;
}
}
int main() {
int n;
fin >> n;
vector<int> heap;
int cnt = 0;
vector<int> pos(MAX);
for (int i = 0; i < n; ++i) {
int x, y;
fin >> x;
if (x == 1) {
fin >> y;
pos[++cnt] = y;
insert(heap, y);
} else if (x == 3) {
fout << heap[0] << "\n";
} else if (x == 2) {
fin >> y;
deleteValue(heap, pos[y]);
}
}
return 0;
}