Cod sursa(job #2890634)

Utilizator RobertuRobert Udrea Robertu Data 16 aprilie 2022 09:23:45
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;

const int dim = 200003;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

vector<int> heap(dim);      //in heap retin pozitiile din v alea valorilor coresp.
vector<int> v(dim);         //in v retin valorile
vector<int> pozitii(dim);   //in pozitii retin pozitia valori

int vi, hi, pi;

void Swap(int p1, int p2) {
    //schimb poz in heap
    int aux = heap[p1];
    heap[p1] = heap[p2];
    heap[p2] = aux;

    pozitii[ heap[p1] ] = p1;
    pozitii[ heap[p2] ] = p2;
}

void goUp(int poz) {
    while( v[ heap[poz] ] < v[ heap[poz / 2] ] ) {
        Swap(poz, poz / 2);
        poz /= 2;
    }
}

void goDown(int poz) {
    int son;

    do {

        son = 0;

        if( poz * 2 <= hi ) {
            son = poz * 2;

            if( poz * 2 + 1 <= hi && v[heap[poz*2 + 1]] < v[heap[son]] )
                son = poz * 2 + 1;

            if( v[heap[son]] >= v[heap[poz]] )
                son = 0;
        }

        if( son ) {
            Swap(son, poz);
            poz = son;
        }

    }while( son );
}

int main() {
    int n, op, val;
    fin >> n;
    for(int k = 0; k < n; k++) {
        fin >> op;
        if( op < 3 ) fin >> val;

        if( op == 1 ) {
            //inserare
            v[++vi] = val;
            heap[++hi] = vi;
            pozitii[vi] = vi;

            goUp(hi);
        } else if( op == 2 ) {
            //stergere

             heap[pozitii[val]]  =  heap[hi--] ;
             

            if( v[ heap[pozitii[val]] ] < v[ heap[ pozitii[val] / 2 ] ] )
                goUp( pozitii[val] );
            else 
                goDown( pozitii[val] );

        } else {
            cout << v[ heap[1] ] << '\n';
        }
    }

    return 0;
}