Cod sursa(job #2492046)

Utilizator buhaidarius@gmail.comBuhai Darius [email protected] Data 13 noiembrie 2019 21:11:28
Problema Heapuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <vector>

using namespace std;

vector<pair<int, int>> heap;

void swap(int i, int j){
    pair<int, int> aux = heap[i];
    heap[i] = heap[j];
    heap[j] = aux;
}

void inserth(int x, int co){
    heap.push_back({x, co});
    int k = heap.size()-1;
    while(k){
        if(heap[(k-1)>>1].first>heap[k].first){
            swap(k, (k - 1) >> 1);
            k--;
            k>>=1;
        }else break;
    }
}

void deleteh(int x){
    int k;
    for(k=0;k<heap.size();k++)
        if(heap[k].second==x-1)
            break;
    swap(k, heap.size()-1);
    heap.pop_back();
    if(heap[k].first<heap[(k-1)>>1].first){
        while(heap[k].first<heap[(k-1)>>1].first){
            swap(k, (k-1)>>1);
            k--;
            k>>=1;
        }
    }else{
        while(1){
            int mini = heap[k].first, minip = k;
            if((k<<1)+1>=heap.size()) break;
            if(heap[(k<<1)+1].first<mini){
                mini = heap[(k<<1)+1].first;
                minip = (k<<1)+1;
            }
            if((k<<1)+2<heap.size() && heap[(k<<1)+2].first<mini){
                mini = heap[(k<<1)+2].first;
                minip = (k<<1)+2;
            }
            if(minip==k) break;
            swap(k, minip);
            k = minip;
        }
    }

}

int main() {

    ifstream cin("heapuri.in");
    ofstream cout("heapuri.out");

    int n, op, x, co = 0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>op;
        if(op==1){
            cin>>x;
            inserth(x, co++);
        }else if(op==2){
            cin>>x;
            deleteh(x);
        }else
            cout<<heap.front().first<<'\n';
    }

    return 0;
}