Cod sursa(job #3149359)

Utilizator PostoacaMateiMatei Postoaca PostoacaMatei Data 7 septembrie 2023 17:55:15
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N_MAX = 2e5;
const int INSERT = 1;
const int ERASE = 2;
const int QUERY = 3;

struct Node{
    int data;
    int index;
    bool operator<(const Node& other) const{
        return data < other.data;
    }
};

int pos[N_MAX];
Node heap[N_MAX];
int heapSize;

inline int parent(int i){
	return (i - 1) / 2;
}

inline int leftChild(int i){
	return 2 * i + 1;
}

inline int rightChild(int i){
	return 2 * i + 2;
}

void upHeap(int i){
	while(i && heap[i] < heap[parent(i)]){
		swap(pos[heap[parent(i)].index], pos[heap[i].index]);
		swap(heap[parent(i)], heap[i]);
		i = parent(i);
	}
}

void downHeap(int i){
	int smallest = i, left = leftChild(i), right = rightChild(i);

	if(left < heapSize && heap[left] < heap[smallest])
		smallest = left;
	if(right < heapSize && heap[right] < heap[smallest])
		smallest = right;

	if(smallest != i){
		swap(pos[heap[smallest].index], pos[heap[i].index]);
		swap(heap[smallest], heap[i]);
		downHeap(smallest);
	}
}

void insert(Node x){
	heap[heapSize++] = x;
	pos[x.index] = heapSize - 1;
	upHeap(pos[x.index]);
}

void erase(int i){
	swap(heap[i], heap[heapSize - 1]);
	swap(pos[heap[i].index], pos[heap[heapSize - 1].index]);
	--heapSize;
	upHeap(i);
	downHeap(i);
}

int query(){
	return heap[0].data;
}

int main(){
	heapSize = 0;

	int queries, op, x, n = 0;
	fin >> queries;
	for(int i = 0; i < queries; ++i){
		fin >> op;
		if(op != QUERY){
			fin >> x;
			if(op == INSERT){
				insert({x, n});
				++n;
			}else{
				erase(pos[x - 1]);
			}
        }else
			fout << query() << '\n';
	}
	return 0;
}