Pagini recente » Cod sursa (job #722096) | Cod sursa (job #2883287) | Cod sursa (job #72733) | Cod sursa (job #3234656) | Cod sursa (job #256734)
Cod sursa(job #256734)
#include <stdio.h>
#define maxn 5000010
#define IN "deque.in"
#define OUT "deque.out"
FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");
int n,k;
int a[maxn],deque[maxn];
int prim,ult;
long long sum;
int main()
{
int i;
fscanf(fin,"%d %d ",&n,&k);
for(i=1;i<=n;i++)
fscanf(fin,"%d ",&a[i]);
fclose(fin);
prim=1;
ult=0;
for(i=1;i<=n;i++)
{
// Cat timp elementul curent este mai mic decat ultimul element din deque,
// eliminam pozitia ultimului element din deque
while(prim<=ult && a[i]<=a[deque[ult]])
ult--;
// Adaug valoarea
ult++;
deque[ult]=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(deque[prim]==i-k)
prim++;
// Afisam minimul, acesta aflandu-se in varful deque-ului
if(i>=k)
sum+=a[deque[prim]];
}
fprintf(fout,"%lld\n",sum);
fclose(fout);
return 0;
}