Pagini recente » Cod sursa (job #1277610) | Cod sursa (job #1785328) | Cod sursa (job #2649356) | Cod sursa (job #2500006) | Cod sursa (job #1212534)
#include <fstream>
#define SIZE 5000001
using namespace std;
ifstream ifs("deque.in");
ofstream ofs("deque.out");
int A[SIZE];
typedef struct DequeNode
{
int val;
DequeNode* next;
DequeNode* prev;
} DequeNode;
typedef Deque
{
DequeNode* first;
DequeNode* last;
} Deque;
Deque* deque;
bool is_empty(Deque* deque)
{
return (deque->first == 0);
}
int get_last(Deque* deque)
{
return deque->last->val;
}
int get_first(Deque* deque)
{
return deque->first->val;
}
void remove_last(Deque* deque)
{
if (is_empty(deque)) return;
DequeNode* prev = deque->last->prev;
if (deque->first == deque->last)
{
delete deque->first;
deque->first = 0;
}
delete deque->last;
deque->last = prev;
}
void add_last(Deque* deque, int e)
{
DequeNode* node = new DequeNode;
node->val = e;
if (deque->first == deque->last)
{
deque->first = node;
}
if (deque->last != 0)
{
deque->last->next = node;
}
deque->last = node;
}
int main()
{
int n, k, e;
int sum = 0;
ifs >> n >> k;
for (int i = 1; i < k; ++i)
{
ifs >> A[i];
while (!is_empty(deque) && A[get_last(deque)] >= A[i])
{
remove_last(deque);
}
add_last(deque, i);
}
for (int i = k; i <= n; ++i)
{
if (get_first(deque) < (n-k+1))
{
remove_first(deque);
}
ifs >> A[i];
while (!is_empty(deque) && A[get_last(deque)] >= A[i])
{
remove_last(deque);
}
add_last(deque, i);
sum += A[get_first(deque)];
}
ofs << sum << "\n";
return 0;
}