Pagini recente » Diferente pentru home intre reviziile 902 si 140 | Monitorul de evaluare | Diferente pentru home intre reviziile 280 si 281 | Profil DraStiK | Cod sursa (job #1904967)
#include <stdio.h>
#define nmax 5000000
int deque[nmax], v[nmax];
int main() {
int n, k, start, stop, i;
long long sum;
FILE *fin, *fout;
fin = fopen( "deque.in", "r" );
fscanf( fin, "%d%d", &n, &k );
start = 0;
stop = -1;
sum = 0LL;
for ( i = 0; i < n; i++ ) {
fscanf( fin, "%d", &v[i] );
while ( start <= stop && v[i] <= v[ deque[stop] ] ) //cat timp putem scoate din deque elementele ce nu sunt maxime
stop--;
deque[++stop] = i; //elementul curent ca fi candva minimul=> ii adaugam poizita in deque
if ( deque[start] == i - k ) //scoate din deakue elementul mai indepartat de k pozitii
start++;
if( i >= k - 1 ) //daca avem o fereastra glisanta completa
sum += v[ deque[start] ]; //pe pozitia start se afla indicele elementului minim din fereastra
}
fclose( fin );
fout = fopen( "deque.out", "w" );
fprintf( fout, "%lld\n", sum );
fclose( fout );
return 0;
}