Pagini recente » Cod sursa (job #43800) | Cod sursa (job #1869896) | Cod sursa (job #2147490) | Cod sursa (job #1122235) | Cod sursa (job #966595)
Cod sursa(job #966595)
#include<iostream>
#include<fstream>
using namespace std;
struct Nod {
int val, poz;
Nod *succ, *pred;
};
struct Deque {
Nod *head, *tail;
};
Deque init_deque() {
Deque d;
d.head = 0;
d.tail = 0;
return d;
}
Nod* make_nod(int val, int poz)
{
Nod *n = new Nod();
n->val = val;
n->poz = poz;
n->succ = 0;
n->pred = 0;
return n;
}
void push_front(Deque &d, int val, int poz)
{
Nod *n = make_nod(val, poz);
if(d.head == d.tail && d.head == 0)
{
d.head = d.tail = n;
}
else
{
n->succ = d.head;
d.head->pred = n;
d.head = n;
}
}
void push_back(Deque &d, int val, int poz)
{
Nod *n = make_nod(val, poz);
if(d.head == d.tail && d.head == 0)
{
d.head = d.tail = n;
}
else
{
d.tail->succ = n;
n->pred = d.tail;
d.tail = n;
}
}
int isEmpty(Deque d)
{
if(d.head == d.tail && d.head == 0)
return 1;
return 0;
}
void pop_front(Deque &d)
{
if(!isEmpty(d))
{
if(d.head == d.tail)
{
delete d.head;
d.head = 0;
d.tail = 0;
}
else
{
Nod *p = d.head;
d.head = p->succ;
d.head->pred = 0;
delete p;
}
}
}
void pop_back(Deque &d)
{
if(!isEmpty(d))
{
if(d.head == d.tail)
{
delete d.tail;
d.head = 0;
d.tail = 0;
}
else
{
Nod *p = d.tail;
d.tail = p->pred;
d.tail->succ = 0;
delete p;
}
}
}
void print_nodes(Deque d)
{
Nod *n = d.head;
while(n != 0)
{
cout << n->val << " ";
n = n->succ;
}
}
int front(Deque d)
{
if(!isEmpty(d))
{
return d.head->val;
}
return 0;
}
int back(Deque d)
{
if(!isEmpty(d))
{
return d.tail->val;
}
return 0;
}
int main()
{
ifstream fin("deque.in");
ofstream fout("deque.out");
int n, k, i, current;
long long rez = 0;
Deque d = init_deque();
fin >> n >> k;
// punem primele k elemente in deque, in ordine crescatoare
for(i = 0; i < k; i++)
{
if(isEmpty(d))
{
fin >> current;
push_back(d, current, i);
}
else
{
fin >> current;
while(current <= back(d) && !isEmpty(d))
{
pop_back(d);
}
push_back(d, current, i);
}
}
rez += front(d);
for(i = k; i < n; i++)
{
fin >> current;
while(current <= back(d) && !isEmpty(d))
{
pop_back(d);
}
push_back(d, current, i);
while(d.head->poz <= i - k)
{
pop_front(d);
}
rez += front(d);
}
fout << rez << endl;
return 0;
}