Cod sursa(job #2492044)

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

using namespace std;

vector<int> heap;
vector<int> order;

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

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

void deleteh(int x){
    int k = order[x-1];
    swap(k, heap.size()-1);
    heap.pop_back();
    if(heap[k]<heap[(k-1)>>1]){
        while(heap[k]<heap[(k-1)>>1]){
            swap(k, (k-1)>>1);
            k--;
            k>>=1;
        }
    }else{
        while(1){
            int mini = heap[k], minip = k;
            if((k<<1)+1>=heap.size()) break;
            if(heap[(k<<1)+1]<mini){
                mini = heap[(k<<1)+1];
                minip = (k<<1)+1;
            }
            if((k<<1)+2<heap.size() && heap[(k<<1)+2]<mini){
                mini = heap[(k<<1)+2];
                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;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>op;
        if(op==1){
            cin>>x;
            inserth(x);
        }else if(op==2){
            cin>>x;
            deleteh(x);
        }else
            cout<<heap.front()<<'\n';
    }

    return 0;
}