Pagini recente » Cod sursa (job #1971792) | Cod sursa (job #1307740) | Cod sursa (job #678469) | Cod sursa (job #314044) | Cod sursa (job #1212540)
#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 struct Deque
{
DequeNode* first;
DequeNode* last;
} Deque;
bool is_empty_deque(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(deque)) return;
DequeNode* prev = deque->last->prev;
if (deque->first == deque->last)
{
delete deque->first;
deque->first = 0;
}
delete deque->last;
deque->last = prev;
deque->last->next = 0;
}
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;
}
void remove_first(Deque* deque)
{
if (is_empty_deque(deque)) return;
DequeNode* next = deque->first->next;
if (deque->first == deque->last)
{
delete deque->last;
deque->last = 0;
}
delete deque->first;
deque->first = next;
deque->first->prev = 0;
}
int main()
{
int n, k;
int sum = 0;
Deque* deque = new Deque;
ifs >> n >> k;
for (int i = 1; i < k; ++i)
{
ifs >> A[i];
while (!is_empty_deque(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(deque) && A[get_last(deque)] >= A[i])
{
remove_last(deque);
}
add_last(deque, i);
sum += A[get_first(deque)];
}
ofs << sum << "\n";
return 0;
}