Pagini recente » Cod sursa (job #2052327) | Cod sursa (job #1846079) | Cod sursa (job #2210086) | Cod sursa (job #898601) | Cod sursa (job #869158)
Cod sursa(job #869158)
#include <fstream>
using namespace std;
int size = 0;
int* heap;
int* ary;
int* idx_before;
int* idx_after;
void insert(int i) {
int son = ++size;
int parent = son >> 1;
heap[son] = i;
while (parent > 0 && ary[heap[parent]] < ary[heap[son]]) {
int aux = heap[parent];
heap[parent] = heap[son];
heap[son] = aux;
son = parent;
parent = son >> 1;
}
}
int pop() {
int index = heap[1];
int parent = 1;
int son = parent << 1;
heap[1] = heap[size];
while (son < size && ary[heap[parent]] < ary[heap[son]]) {
int aux = heap[parent];
int second_son = son | 1;
if (ary[heap[son]] < ary[heap[second_son]]) {
son = second_son;
}
heap[parent] = heap[son];
heap[son] = aux;
parent = son;
son = parent << 1;
}
size -= 1;
return index;
}
int main() {
ifstream in("podm.in");
ofstream out("podm.out");
int n;
int index;
int sum = 0;
int idx_b, idx_a;
in >> n;
n += 1;
ary = new int[n + 7];
heap = new int[n + 7];
idx_before = new int[n + 7];
idx_after = new int[n + 7];
for (int i = 0; i < n; ++i) {
in >> ary[i];
if (i > 0 && i < n - 1) {
insert(i);
idx_before[i] = i - 1;
idx_after[i] = i + 1;
}
}
while (size) {
index = pop();
idx_a = idx_after[index];
idx_b = idx_before[index];
sum += ary[idx_b] * ary[index] * ary[idx_a];
idx_after[idx_b] = idx_a;
idx_before[idx_a] = idx_b;
}
out << sum;
in.close();
out.close();
return 0;
}