Cod sursa(job #2890650)

Utilizator RobertuRobert Udrea Robertu Data 16 aprilie 2022 11:10:32
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 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 in heap
 
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 {
            fout << v[ heap[1] ] << '\n';
        }
 
        // cout << "Pasul " << k + 1 << ": ";
        // for(int i = 1; i <= hi; i++)
        //     cout << heap[i] << " ";
        // cout << '\n';
    }
 
    return 0;
}