Cod sursa(job #2808568)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 25 noiembrie 2021 11:57:43
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <stdio.h>
#include <iostream>
#define MAX_H 200000

using std::swap;

struct node {
    int val;
    int poz;
};

node heap[MAX_H];
int nheap;

bool out[MAX_H];

int nop1;

inline int parent( int nod ) {
    return (nod - 1) / 2;
}

inline int leftChild( int nod ) {
    return nod * 2 + 1;
}

inline int rightChild( int nod ) {
    return nod * 2 + 2;
}

void propagUp( int nod ) {
    while ( nod && heap[parent( nod )].val > heap[nod].val ) {
        swap( heap[parent( nod )], heap[nod] );
        nod = parent( nod );
    }
}

void propagDown( int nod ) {
    int minn = nod;
    if ( leftChild( nod ) < nheap && heap[leftChild( nod )].val < heap[minn].val )
        minn = leftChild( nod );
    if ( rightChild( nod ) < nheap && heap[rightChild( nod )].val < heap[minn].val )
        minn = rightChild( nod );
    if ( minn != nod ) {
        swap( heap[nod], heap[minn] );
        propagDown( minn );
    }
}

void insertHeap( int val ) {
    heap[nheap].val = val;
    heap[nheap].poz = nop1 ++;
    propagUp( nheap );
    nheap ++;
}

int removeMin() {
    node aux = heap[0];
    heap[0] = heap[-- nheap];
    propagDown( 0 );
    return aux.val;
}

int main() {
    FILE *fin, *fout;
    int n, op, x;

    fin = fopen( "heapuri.in", "r" );
    fout = fopen( "heapuri.out", "w" );
    fscanf( fin, "%d", &n );
    for ( int i = 0; i < n; i ++ ) {
        fscanf( fin, "%d", &op );
        if ( op == 1 ) {
            fscanf( fin, "%d", &x );
            insertHeap( x );
        }
        else if ( op == 2 ) {
            fscanf( fin, "%d", &x );
            out[x - 1] = true;
        }
        else {
            while ( out[heap[0].poz] )
                removeMin();
            fprintf( fout, "%d\n", heap[0].val );
        }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}