Cod sursa(job #1117794)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 23 februarie 2014 20:13:18
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
#include <queue>
#include <string>
#include <map>
#include <set>


#define DN 200005
#define INF 200001
#define pb push_back
#define mp make_pair
#define per pair<int,int>
#define LL long long
#define un unsigned
#define x first
#define y second
using namespace std;

int v[DN],arb[4*DN],poz_arb[DN];
/// v[ i ] = al i-lea elemnt inserat
/// arb[i] = pozitia elementului din heap de pe poz i
/// poz_arb[ i ] = pe ce pozitie apare al i-lea element inserat in arbore

void heap_insert(int p){

    arb[ ++arb[0] ] = p;

    poz_arb[ p ] = arb[0];

    for(int nod = arb[0] ; nod && v[ arb[ nod ] ] < v[ arb[nod/2] ] ; nod/=2){

        poz_arb[ arb[ nod] ] = nod / 2;
        poz_arb[ arb[nod/2] ] = nod;
        //swap( poz_arb[nod] , poz_arb[nod/2]);
        swap( arb[ nod ], arb[nod/2]);
    }
}

void heap_erase(int p){

    //cout<<"SWAP :" << arb [ arb[0] ] <<endl;
    swap( arb [ poz_arb[p] ] , arb[ arb[0] ] );
    arb [ arb[0] ] = INF;
    --arb[0];


    for(int nod = poz_arb[p] ; v[ arb[nod] ] > min( v[ arb[2*nod] ], v[ arb[ 2*nod + 1 ]] );){

        if( v[arb[ 2*nod ]] < v[arb[ 2*nod + 1 ]]){

            poz_arb[ arb[nod] ] = 2*nod;
            poz_arb[ arb[2*nod] ] = nod;
            swap(arb[nod],arb[2*nod]);
            nod = 2*nod;
        }else{

            poz_arb[ arb[nod] ] = 2*nod + 1;
            poz_arb[ arb[2*nod+1]] = nod;
            swap(arb[nod],arb[2*nod+1]);
            nod = 2*nod + 1;
        }
    }
}

int main()
{
    int m;
    memset(v,127,sizeof(v)); v[0]=0;
    ifstream f("heapuri.in");
    ofstream g("heapuri.out");
    f>>m;

    for(int i=1;i<=m;++i)
        arb[i]=INF;

    for(;m--;)
    {
        int op,x;
        f>>op;
        if(op==1){

            f>>x;
            v[ ++v[0] ] = x;
            heap_insert( v[0] );
        }
        if(op==2){

            f>>x;
            //cout<<"Poz_ arb "<<poz_arb[x]<<endl;
            heap_erase(x);
        }
        if(op==3){
            g<<v[arb[1]]<<"\n";
        }
        /*cout<<"ARB:\n";
        for(int i=1;i<=arb[0];++i)
            cout<<arb[i]<<" ";

        cout<<endl;
        cout<<"Poz_ARB:\n";
        for(int i=1;i<=arb[0];++i)
            cout<<poz_arb[i]<<" ";

        cout<<endl;*/
    }
    return 0;
}