Cod sursa(job #2561392)

Utilizator tudorcioc5Cioc Tudor tudorcioc5 Data 28 februarie 2020 19:25:22
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <iostream>
#include <vector>

#define maxn 200010

using namespace std;

int N, L, NR;

vector <int> A (maxn , 0);
vector <int> Heap (maxn , 0);
vector <int> Pos (maxn , 0);

void push(int x){
    int aux;

    while (x/2 && A[Heap[x]]<A[Heap[x/2]]){
        aux = Heap[x];
        Heap[x] = Heap[x/2];
        Heap[x/2] = aux;

        Pos[Heap[x]] = x;
        Pos[Heap[x/2]] = x/2;
        x /= 2;
    }
}


void pop(int x){
    int aux, y = 0;

    while (x != y){
        y = x;

        if (y*2<=L && A[Heap[x]]>A[Heap[y*2]])
            x = y*2;

        if (y*2+1<=L && A[Heap[x]]>A[Heap[y*2+1]])
            x = y*2+1;

        aux = Heap[x];
        Heap[x] = Heap[y];
        Heap[y] = aux;

        Pos[Heap[x]] = x;
        Pos[Heap[y]] = y;
    }
}

ifstream fin;
ofstream fout;


int main(){
    int i, x, cod;

    fin.open("heapuri.in");
    fout.open("heapuri.out");
    fin>>N;

    for (i=1; i<=N; i++)    {
        fin>>cod;

        switch (cod){
            case 1:
                fin>>x;
                L++, NR++;
                A[NR] = x;
                Heap[L] = NR;
                Pos[NR] = L;
                push(L);

                break;

            case 2:
                fin>>x;
                A[x] = -1;
                push(Pos[x]);

                Pos[Heap[1]] = 0;
                Heap[1] = Heap[L--];
                Pos[Heap[1]] = 1;
                if (L>1)
                    pop(1);

                break;


            case 3:
                fout<<A[Heap[1]]<<"\n";

                break;
        }

    }

    fin.close();
    fout.close();

    return 0;
}