Pagini recente » Diferente pentru problema/hoata2 intre reviziile 67 si 68 | Diferente pentru problema/hoata2 intre reviziile 46 si 47 | Diferente pentru problema/hoata2 intre reviziile 55 si 56 | Diferente pentru problema/hoata2 intre reviziile 79 si 80 | Cod sursa (job #2675769)
#include <stdio.h>
#define MAX_N 5000000
int v[MAX_N], coada[MAX_N];
int first, size;
void push_back( int x ) {
coada[first + size] = x;
size++;
}
int pop_front() {
if ( size == 0 )
return 0;
first++;
size--;
return 1;
}
int pop_back() {
if ( size == 0 )
return 0;
size--;
return 1;
}
int front() {
return size > 0 ? coada[first] : -1;
}
int back() {
return size > 0 ? coada[(first + size - 1) % MAX_N] : -1;
}
int main() {
FILE *fin, *fout;
int n, k, t, i;
long long s;
fin = fopen( "deque.in", "r" );
fscanf( fin, "%d%d", &n, &k );
s = first = size = 0;
for ( i = 0; i < n; i++ ) {
fscanf( fin, "%d", &v[i] );
t = back();
while ( t >= 0 && v[i] <= v[t] ) {
pop_back();
t = back();
}
push_back( i );
if ( i >= k - 1 ) {
s += v[front()];
if ( front() == i - k + 1 )
pop_front();
}
}
fclose( fin );
fout = fopen( "deque.out", "w" );
fprintf( fout, "%lld", s );
fclose( fout );
return 0;
}