Cod sursa(job #950334)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 16 mai 2013 16:13:27
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include <fstream>

using namespace std;

struct nod
{
   int val;
   int ind;
};

nod heap[200005];
int frec[200005];
int lung;

inline int tata(int x)
{
    return (x/2);
}
inline int fiu_s(int x)
{
    return (x<<1);
}
inline int fiu_d(int x)
{
    return (x<<1+1);
}

void schimba(int x,int y)
{
    nod aux;
    aux=heap[x];
    heap[x]=heap[y];
    heap[y]=aux;

    int aux2;
    aux2=frec[heap[y].ind];
    frec[heap[y].ind]=frec[heap[x].ind];
    frec[heap[x].ind]=aux2;
}

void urca(int poz)
{
    while(poz!=1)
      if(heap[poz].val<heap[tata(poz)].val)
      {
          schimba(poz,tata(poz));
          poz=tata(poz);
      }
      else
          break;
}
#define inf 1000000005

void coboara(int poz)
{
    int indice=-1;
    int valoare=inf;
    while(1)
    {
        indice=-1;
        valoare=inf;
        if(heap[fiu_s(poz)].val<heap[poz].val && fiu_s(poz)<=lung && heap[fiu_s(poz)].val<valoare)
        {
            valoare=heap[fiu_s(poz)].val;
            indice=fiu_s(poz);
        }
        if(heap[fiu_d(poz)].val<heap[poz].val && fiu_d(poz)<=lung && heap[fiu_d(poz)].val<valoare)
        {
            valoare=heap[fiu_d(poz)].val;
            indice=fiu_d(poz);
        }

        if(indice>-1)
        {
           schimba(poz,indice);
           poz=indice;
        }
        else
           break;
    }
}

int cron;

void insert(int x)
{
    heap[++lung].val=x;
    heap[lung].ind=cron;
    frec[cron++]=lung;
    urca(lung);
}

void del(int x)
{
    int poz=frec[x];
    //cout<<endl<<"Valoare de coborare este "<<poz<<endl;
    schimba(poz,lung);

    frec[heap[lung].ind]=0;
    heap[lung].val=0;
    heap[lung].ind=0;

    lung--;
    coboara(poz);
}

int min()
{
   return heap[1].val;
}

/*
void afis()
{
    cout<<endl<<"Heapul este: "<<endl;
    int i;
    for(i=1;i<=lung;i++)
    {
        cout<<heap[i].val<<' ';
    }
    cout<<'\n';
    for(i=1;i<=lung;i++)
    {
        cout<<heap[i].ind<<' ';
    }
    cout<<'\n';
}*/

int main()
{
    ifstream cin("heapuri.in");
    ofstream cout("heapuri.out");
    
    int n,i,cod,val;
    lung=0;
    cron=1;

    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>cod;

        if(cod==3)
        {
            cout<<min()<<'\n';
            continue;
        }
        cin>>val;

        if(cod==1)
            insert(val);
        else
            del(val);
        //afis();
    }

    cin.close();
    cout.close();
    //system("PAUSE");
    return 0;
}