Cod sursa(job #2947730)

Utilizator cezarTriscaVicolCezar Trisca Vicol 2 cezarTriscaVicol Data 26 noiembrie 2022 17:26:29
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

const int MaxN = 200010;

int N, op, global, heap_length;

int value[MaxN], heap[MaxN], position[MaxN];

void Push(int val){
    int aux;

    while(val/2 > 0 && value[heap[val]] < value[heap[val/2]]){
        swap(heap[val], heap[val/2]);

        position[heap[val  ]] = val;
        position[heap[val/2]] = val/2;

         val /= 2;
    }
}

void Pop(int val){
    int y=0;

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

        if(y*2  <=heap_length && value[heap[val]] > value[heap[y*2  ]]) val = y * 2;
        if(y*2+1<=heap_length && value[heap[val]] > value[heap[y*2+1]]) val = y * 2 + 1;

        if(val == y) break;

        swap(heap[val], heap[y]);
        position[heap[val]] = val;
        position[heap[y  ]] = y;
    }
}

int main()
{
    f>>N;
    for(;N;N--){
        f>>op;
        int x;
        if(op<=2)
            f>>x;
        if(op==1){
            global++;
            value[global] = x;
            heap_length++;
            heap[heap_length] = global;
            position[global] = heap_length;
            Push(heap_length);
        }else if(op==2){
            value[x] = -1;
            Push(position[x]);
            position[heap[1]] = 0;
            heap[1] = heap[heap_length];
            heap_length--;
            position[heap[1]] = 1;
            if(heap_length > 1) Pop(1);
        }else{
            g<<value[heap[1]]<<'\n';
        }
    }
    return 0;
}