Cod sursa(job #1846564)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 13 ianuarie 2017 13:23:22
Problema Heapuri Scor 0
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");

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

void percolate(int p, int x)
{
    while (heap[p]<heap[p / 2] && p!=1)
    {
        swap(heap[p], heap[p / 2]);
        swap(poz[p], poz[p / 2]);
        nr[poz[p]]=p;
        nr[poz[p / 2]]=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]<=heap[b] && heap[p]>heap[a])
            {
                swap(heap[p], heap[a]);
                swap(poz[p], poz[a]);
                nr[poz[p]]=p;
                nr[poz[a]]=a;
                p=a;
            }
            if (heap[b]<=heap[a] && heap[p]>heap[b])
            {
                swap(heap[p], heap[b]);
                swap(poz[p], poz[b]);
                nr[poz[p]]=p;
                nr[poz[b]]=b;
                p=b;
            }
        }
        else
        {
            if (a<=N && heap[p]>heap[a])
            {
                swap(heap[p], heap[a]);
                swap(poz[p], poz[a]);
                nr[poz[p]]=p;
                nr[poz[a]]=a;
                p=a;
            }
            if (a>N)
              break;
        }
    }
}

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