Cod sursa(job #1691402)

Utilizator robx12lnLinca Robert robx12ln Data 18 aprilie 2016 11:10:23
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<fstream>
#include<algorithm>
#define DIM 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int Pos[DIM], n, m, k, t, x;
struct str{
    int val;
    int inh;
} Heap[DIM];
str make_str( int val, int inh ){
   str My_str = { val ,inh };
   return My_str;
}
void up( int son ){
    int father = son / 2;
    if( father >= 1 && Heap[son].val < Heap[father].val ){
        swap( Pos[ Heap[son].inh ], Pos[ Heap[father].inh ] );
        swap( Heap[son], Heap[father] );
        up( father );
    }
    return ;
}
void down( int father ){
    int son = father * 2;
    if( son + 1 <= n && Heap[son].val > Heap[son + 1].val ){
        son++;
    }
    if( son <= n && Heap[son].val < Heap[father].val ){
        swap( Pos[ Heap[son].inh ], Pos[ Heap[father].inh ] );
        swap( Heap[son], Heap[father] );
        down( son );
    }
    return ;
}
int main(){
    fin>>m;
    n = 0;
    k = 0;
    // Heap[i].val = valuare elementului de pe pozitia i din Heap
    // Heap[i].inh = al catelea intrat este elementului de pe pozitia i din Heap
    // Pos[i] = pozitia in Heap al celui de-al i lea intrat
    for( int i = 1; i <= m ; i++ ){
        fin >> t;
        if( t == 3 ){
            fout << Heap[1].val << "\n";
        }
        if( t == 1){
            fin >> x;
            Heap[++n] = make_str( x, ++k );
            Pos[k] = n;
            up( n );
        }
        if( t == 2 ){
            fin >> x;
            int y = Pos[x];
            swap( Pos[ Heap[y].inh ], Pos[ Heap[n].inh ] );
            swap( Heap[n], Heap[y] );
            Pos[ Heap[n].inh ] = 0;
            n --;
            down( y );
        }
    }
    return 0;
}