Cod sursa(job #1847302)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 14 ianuarie 2017 15:06:59
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#define VAL 200005

using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

struct Heaps
{
    int val, pos;
};

Heaps heap[VAL];

int N, M, i, j;
int op, x, a, b;
int v[VAL], K;
int poz[VAL];

void change(int x, int y)
{
    swap(heap[x], heap[y]);
    poz[heap[x].pos]=x;
    poz[heap[y].pos]=y;
}

void percolate(int p)
{
    while (heap[p].val<heap[p / 2].val && p!=1)
    {
        change(p, p / 2);
        p/=2;
    }
}

void sift(int p)
{
    while (p<N)
    {
        a=2*p;
        b=2*p+1;
        if (a<=N && b<=N)
        {
            if (heap[a].val<=heap[b].val && heap[p].val>heap[a].val)
            {
                change(p, a);
                p=a;
            }
            if (heap[b].val<=heap[a].val && heap[p].val>heap[b].val)
            {
                change(p, b);
                p=b;
            }
        }
        else
        {
            if (a<=N && heap[p].val>heap[a].val)
            {
                change(p, a);
                p=a;
            }
            else
              if (a>N)
                break;
        }
    }
}

int main()
{
    fin >> M;
    for (i=1; i<=M; i++)
    {
        fin >> op;
        if (op==3)
        {
            fout << heap[1].val  << '\n';
            /*for (j=1; j<=K; j++)
              fout << heap[j].val << " " << heap[j].pos << " " << poz[heap[j].pos] << '\n';*/
           // fout << '\n';
        }
        else
          fin >> x;
        if (op==1)
        {
            v[++N]=x;
            poz[N]=N;
            heap[N].val=x;
            heap[N].pos=N;
            K++;
            poz[N]=N;
            percolate(N);
        }
        if (op==2)
        {
            a=poz[x];
            //fout << a << '\n';
            change(K, poz[x]);
            K--;
            /*for (j=1; j<=K; j++)
              fout << heap[j].val << " " << heap[j].pos << " " << poz[heap[j].pos] << '\n';
            fout << '\n';*/
            sift(a);
        }
    }
    fin.close();
    fout.close();
    return 0;
}