Pagini recente » Cod sursa (job #2332147) | Cod sursa (job #2566820) | Cod sursa (job #1884994) | Cod sursa (job #1220375) | Cod sursa (job #3130909)
#include <fstream>
std::ifstream in;
std::ofstream out;
class heap{
// std::vector<int> v;
int v[200005], n;
public:
heap();
void descent(int);
void rise(int);
void insert(int);
void pop(int);
int top();
int find(int);
};
void heap::descent(int pos) {
int aux;
if (2 * pos + 1 >= n)
return;
if ((2 * pos + 2 == n) or v[2 * pos + 1] < v[2 * pos + 2])
if (v[2 * pos + 1] < v[pos])
{
aux = v[pos];
v[pos] = v[2 * pos + 1];
v[2 * pos + 1] = aux;
heap::descent(2 * pos + 1);
return;
}
else
return;
else
if (v[2 * pos + 2] < v[pos])
{
aux = v[pos];
v[pos] = v[2 * pos + 2];
v[2 * pos + 2] = aux;
heap::descent(2 * pos + 2);
return;
}
else
return;
}
void heap::rise(int pos) {
while(pos){
if(v[(pos - 1) / 2] > v[pos]){
int aux = v[(pos - 1) / 2];
v[(pos - 1) / 2] = v[pos];
v[pos] = aux;
pos = (pos - 1) / 2;
}
else
break;
}
}
void heap::insert(int val) {
v[n++] = val;
heap::rise(n-1);
}
void heap::pop(int pos) {
if(pos == -1)
return;
v[pos] = v[n-1];
n--;
heap::descent(pos);
heap::rise(pos);
}
int heap::top() {
return v[0];
}
int heap::find(int val) {
for(int i = 0; i < n; i++)
if(v[i] == val)
return i;
return -1;
}
heap::heap() {
n = 0;
}
int main() {
int n, v[200005], i, op, x, m=0;
heap h;
in.open("heapuri.in");
out.open("heapuri.out");
in>>n;
for(i = 0; i < n; i++){
in>>op;
if(op == 1){
in >> x;
v[m++] = x;
h.insert(x);
}
else if(op==2){
in >> x;
h.pop(h.find(v[x-1]));
}
else if(op == 3){
out<<h.top()<<'\n';
}
}
in.close();
out.close();
return 0;
}