Pagini recente » Borderou de evaluare (job #2986325) | Cod sursa (job #1572764) | Monitorul de evaluare | Cod sursa (job #1183330)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int v[200010];
int c;
void pushUp (int heap[], int poz, int p, int i) {
if (poz == 0)
return;
int indice = (poz - 1) / 2;
if (heap[indice] > heap[poz]) {
int aux;
aux = heap[indice];
heap[indice] = heap[poz];
heap[poz] = aux;
v[p] = indice;
v[i] = poz;
v[poz] = indice;
v[indice] = poz;
pushUp(heap, indice, p , i);
}
}
void pushDown (int heap[], int poz, int dimVect, int p) {
int indice;
int i;
if (2 * poz + 2 > dimVect && 2 * poz + 1 > dimVect)
return;
else if (2 * poz + 2 > dimVect && 2 * poz + 1 <= dimVect)
indice = 2 * poz + 1;
else if (2 * poz + 2 <= dimVect && 2 * poz + 1 > dimVect)
indice = 2 * poz + 2;
else {
if (heap[2 * poz + 2] > heap[2 * poz + 1])
indice = 2 * poz + 1;
else
indice = 2 * poz + 2;
}
if (c == 0) {
i = indice;
c++;
}
if (heap[poz] > heap[indice]) {
int aux;
aux = heap[indice];
heap[indice] = heap[poz];
heap[poz] = aux;
v[p] = indice;
v[i] = poz;
v[poz] = indice;
v[indice] = poz;
pushDown(heap,indice,dimVect,p);
}
}
int main() {
ifstream in;
in.open("heapuri.in");
ofstream out;
out.open("heapuri.out");
int n, i, Op, x, *heap, dim = 0;
in >> n;
heap = new int[n];
for (i = 0; i < n; i++) {
in >> Op;
if (Op == 1) {
in >> x;
heap[dim] = x;
v[dim] = dim;
pushUp(heap,dim,dim,(dim - 1) / 2);
dim++;
}
else if (Op == 2) {
in >> x;
dim--;
heap[v[x-1]] = heap[dim];
pushDown(heap,v[x-1],dim,v[x-1]);
c--;
}
else {
out << heap[0] << "\n";
}
}
in.close();
out.close();
return 0;
}