Pagini recente » Cod sursa (job #136802) | Cod sursa (job #918030) | Cod sursa (job #747433) | Cod sursa (job #977833) | Cod sursa (job #984179)
Cod sursa(job #984179)
#include <fstream>
struct Pair
{
int ind, key;
};
class Deque
{
struct Node
{
Pair data;
Node *next;
Node *prev;
};
Node *start, *end;
Pair a;
public:
Deque() : start(NULL), end(NULL) { }
~Deque()
{
while(start != NULL)
pop_back();
}
bool empty()
{
return start == NULL;
}
void push_front(Pair key)
{
if(start == NULL)
{
Node *c = new Node();
c->data = key;
start = end = c;
}
else
{
Node *c = new Node();
c->data = key;
c->next = start;
start->prev = c;
start = c;
}
}
void push_back(Pair key)
{
if(end == NULL)
push_front(key);
else
{
Node *c = new Node();
c->data = key;
c->prev = end;
end->next = c;
end = c;
}
}
Pair front()
{
if(start != NULL) return start->data;
return a;
}
Pair back()
{
if(start != NULL) return end->data;
return a;
}
void pop_front()
{
Node *c = start;
if(start->next == NULL) start = end = NULL;
else
{
start = start->next;
start->prev = NULL;
}
delete c;
}
void pop_back()
{
Node *c = end;
if(end->prev == NULL) start = end = NULL;
else
{
end = end->prev;
end->next = NULL;
}
delete c;
}
};
int main()
{
std::ifstream in("deque.in");
std::ofstream out("deque.out");
Deque myDeq;
int nV, k;
Pair x;
in >> nV >> k;
long long sum = 0;
for(int i = 1; i <= nV; i++)
{
in >> x.key;
x.ind = i;
while(myDeq.front().ind <= i - k && !myDeq.empty())
myDeq.pop_front();
while(myDeq.back().key >= x.key && !myDeq.empty())
myDeq.pop_back();
myDeq.push_back(x);
if(i >= k)
sum += myDeq.front().key;
}
out << sum;
return 0;
}