Cod sursa(job #1423118)

Utilizator Baietii_De_CartierAndrei Oprisan Baietii_De_Cartier Data 21 aprilie 2015 14:56:51
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
const int DIMENSION = 200001;
int Heap[DIMENSION];
int size = 0;
int Position[DIMENSION];
int Order[DIMENSION];
int nr_elements = 0;

void insert(int x)
{
   ++nr_elements;
   ++size;
   Heap[size]=x;
   Position[nr_elements]=size;
   Order[size]=nr_elements;
   int aux=size;
   while( (aux/2) !=0 && Heap[aux]<Heap[aux/2])
   {
       swap(Position[Order[aux]],Position[Order[aux/2]]);
       swap(Order[aux],Order[aux/2]);
       swap(Heap[aux],Heap[aux/2]);
       aux=aux/2;
   }
}
void remove(int ord)
{
    int pos = Position[ord];
    swap(Heap[Position[ord]],Heap[size]);
    swap(Position[Order[pos]],Position[Order[size]]);
    swap(Order[pos],Order[size]);
    --size;
    while( (pos/2)!=0 && Heap[pos] < Heap[pos/2] )
    {
       swap(Position[Order[pos]],Position[Order[pos/2]]);
       swap(Order[pos],Order[pos/2]);
       swap(Heap[pos],Heap[pos/2]);
       pos=pos/2;
    }
    while(pos*2 <= size)
    {
        if(pos*2+1 <= size && Heap[pos*2+1] < Heap[pos] && Heap[pos*2+1] < Heap[pos*2])
        {
            swap(Position[Order[pos*2+1]],Position[Order[pos]]);
            swap(Order[pos],Order[pos*2+1]);
            swap(Heap[pos],Heap[pos*2+1]);
            pos=pos*2+1;
        }
        else
             if( (pos*2+1 <= size && Heap[pos*2] < Heap[pos] && Heap[pos*2] < Heap[pos*2+1]) || (pos*2+1 > size && Heap[pos*2] < Heap[pos]) )
             {
                swap(Position[Order[pos*2]],Position[Order[pos]]);
                swap(Order[pos],Order[pos*2]);
                swap(Heap[pos],Heap[pos*2]);
                pos=pos*2;
             }
             else
                break;
    }
}
int show_min()
{
    return Heap[1];
}
int main()
{
    ifstream f("heapuri.in.txt");
    ofstream g("heapuri.out");
    int N,op,x;
    f>>N;
    cout<<N;
    for(int i=0;i<N;i++)
    {
        f>>op;
        cout<<op<<endl;
        if(op==1)
        {
            f>>x;
            insert(x);
        }
        if(op==2)
        {
            f>>x;
            remove(x);
        }
        if(op==3)
        {
            g<<show_min()<<endl;
        }
    }
    f.close();
    g.close();
}