Pagini recente » Cod sursa (job #894037) | Cod sursa (job #43247) | Cod sursa (job #282574) | Cod sursa (job #1694985) | Cod sursa (job #563445)
Cod sursa(job #563445)
#include <stdio.h>
#include<deque>
#define NMAX 5000005
using namespace std;
long long N,K,x,suma;
long long V[NMAX];
FILE *in,*out;
deque<long long> deck;
int main()
{
in=fopen("deque.in","rt");
out=fopen("deque.out","wt");
fscanf(in,"%lld %lld",&N,&K);
fscanf(in,"%lld",&V[1]);
deck.push_back(1);
for(int i=2;i<=N;i++)
{
fscanf(in,"%lld",&V[i]);
// Cat timp elementul curent este mai mic decat ultimul element
// din deque, eliminam pozitia ultimului element din deque
while(!deck.empty() && V[i]<=V[deck.back()])
deck.pop_back();
deck.push_back(i);
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia
// din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if(deck.front()==i-K)
deck.pop_front();
if(i>=K)
suma+=V[deck.front()];
}
fprintf(out,"%lld\n",suma);
fclose(in);
fclose(out);
return 0;
}