Cod sursa(job #2672738)

Utilizator Katherine456719Swan Katherine Katherine456719 Data 14 noiembrie 2020 16:47:34
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
vector <int> order,heap;
int whereheap[200005];
void insert(int &x)
{
    heap.push_back(x);
    int n = heap.size()-1;
    while(heap[n] < heap[n/2] and  n != 0) {
        swap(heap[n], heap[n / 2]);
        swap(whereheap[n], whereheap[n / 2]);
        n /= 2;
    }
}
void del(int &x)
{
    int ord = whereheap[order[x - 1]];
    int n = heap.size() - 1;
    swap(heap[ord],heap[n]);
    swap(whereheap[ord], whereheap[n]);
    heap[n] = 0;
    if(ord == 0)
        ord += 2;
    else
        ord *= 2;
   while(ord < heap.size() - 1) {
       if (heap[ord] > heap[ord + 1])
       {
           swap(heap[ord], heap[ord / 2]);
           swap(whereheap[ord], whereheap[ord / 2]);
       }
       else
       {
           swap(heap[ord + 1], heap[ord / 2]);
           swap(whereheap[ord + 1], whereheap[ord / 2]);
           ord += 1;
       }
       ord *= 2;
   }
}
int main() {
    heap.push_back(0);
    int n;
    fin >> n;
    while(n--)
    {
        int op;
        fin >> op;
        if(op == 1)
        {
            int x;
            fin >> x;
            order.push_back(x);
            whereheap[x] = heap.size() - 1;
            insert(x);
        }
        if(op == 2)
        {
            int x;
            fin >> x;
            del(x);
            for(int i = x + 1;i < order.size(); ++i)
                order[i - 1] = order[i];
        }
        if(op == 3)
        {
            fout << heap[1] << "\n";
        }
    }
    return 0;
}