Cod sursa(job #2222814)

Utilizator ShutterflyFilip A Shutterfly Data 18 iulie 2018 03:08:56
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iomanip>
#include <set>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int pos[200001];
pair<int, int> v[200002];
int heaplevel = 1;

void lift(int ind);
void dec(int ind);
void insertelem(int val);
void deleteelem(int ind);
void swp (int ind1, int ind2);

void deleteelem (int ind) {
    swp (ind, heaplevel-1);
    ///shake the lil burger up
    heaplevel--;
    lift(ind);
    dec(ind);
}

void insertelem(int val, int addcnt) {
    v[heaplevel].first = val;
    v[heaplevel].second = addcnt;
    pos[addcnt] = heaplevel;
    lift(heaplevel);
    heaplevel++;
}

void lift (int ind) {
    if (ind != 1)
        if (v[ind].first < v[ind/2].first) {
            swp(ind, ind/2);
            lift(ind/2);
        }
}

void swp (int ind1, int ind2) {
    swap (pos[v[ind1].second], pos[v[ind2].second]);
    swap (v[ind1], v[ind2]);
}

void dec (int ind) {
    if (2 * ind + 1 < heaplevel) {
        if (v[2 * ind].first < v[2 * ind + 1].first && v[2 * ind].first < v[ind].first) {
            swp(2 * ind, ind);
            dec (2 * ind);
        } else if (v[2 * ind + 1].first < v[2 * ind].first && v[2 * ind + 1].first < v[ind].first) {
            swp(2 * ind + 1, ind);
            dec (2 * ind + 1);
        }
    } else if (2 * ind < heaplevel) {
        if (v[2 * ind].first < v[ind].first) {
            swp(2 * ind, ind);
            dec (2 * ind);
        }
    }
}

int addz = 1;
int main () {
    freopen("heapuri.in", "r", stdin);
    freopen("heapuri.out", "r", stdin);
    int n;
    cin >> n;
    int sos = 0;

    for (int i = 0; i < n; i++) {
        int op;
        cin >> op;
        if (op == 1) {
            int val;
            cin >> val;
            insertelem(val, addz);
            addz++;
        } else if (op == 2) {
            int ord;
            cin >> ord;
            deleteelem(pos[ord]);
        } else if (op == 3) {
            cout << v[1].first << '\n';
        }
    }
}