Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using std::cin;
- using std::cout;
- const long long SIZE = 1e6;
- long long pointer[SIZE]; //polong longer[i] содержит номер вершины где сейчас находится элемент добавленный на i-м запрсосе
- long long num[SIZE]; //num[v] - говорит на каком шаге была добавлена вершина
- //строим кучу так что число в вершине не превосходит чисел в его поддереве
- //использую 1-нумерацию
- void Reverse(long long u, long long v) { //функция свапает две вершины с учётом num и polong longer
- long long k = num[u];
- long long m = num[v];
- std::swap(num[u], num[v]);
- std::swap(pointer[k], pointer[m]);
- /*std::swap(num[u], num[v]);
- pointer[num[u]] = v;
- pointer[num[v]] = u; */
- }
- void SiftUp(std::vector<long long> &a, long long v) { //поднимает число на нужное место
- while (v != 1) {
- if (a[v] < a[v/2]) {
- Reverse(v, v / 2);
- std::swap(a[v], a[v/2]);
- v /= 2;
- }
- else {
- break;
- }
- }
- }
- void SiftDown(std::vector<long long> &a, long long v) {
- long long n = a.size() - 1;
- while (2*v <= n) { //условие существования ребёнка
- long long u = 2*v;
- if (2*v + 1 <= n && a[2*v + 1] < a[2*v]) {
- u = 2*v + 1;
- }
- if (a[u] < a[v]) {
- Reverse(u, v);
- std::swap(a[u], a[v]);
- v = u;
- }
- else {
- break;
- }
- }
- }
- long long getMin(std::vector<long long> &a) {
- return a[1];
- }
- void Insert(std::vector<long long> &a, long long x, long long i) {
- long long n = a.size() - 1;
- a.push_back(x);
- pointer[i] = n + 1;
- num[n + 1] = i;
- SiftUp(a, n + 1);
- }
- void ExtractMin(std::vector<long long> &a) {
- long long n = a.size() - 1;
- Reverse(1, n);
- std::swap(a[1], a[n]);
- a.pop_back();
- SiftDown(a, 1);
- }
- void DecreaseKey(std::vector<long long> &a, long long i, long long delta) {
- a[pointer[i]] -= delta;
- SiftUp(a, pointer[i]);
- }
- int main() {
- std::ios_base::sync_with_stdio(false);
- std::cin.tie(NULL);
- long long q;
- cin >> q;
- std::vector<long long> a; //будет хранить число хранящееся в i-й вершине
- a.push_back(0); //этот элемент нужен для 1-нумерация
- std::string s;
- for (long long i = 1; i <= q; i++) {
- cin >> s;
- if (s == "insert") {
- long long x;
- cin >> x;
- Insert(a, x, i);
- }
- if (s == "getMin") {
- long long temp = getMin(a);
- cout << temp << "\n";
- }
- if (s == "extractMin") {
- ExtractMin(a);
- }
- if (s == "decreaseKey") {
- long long j, delta;
- cin >> j >> delta;
- DecreaseKey(a, j, delta);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement