Pagini recente » Cod sursa (job #241296) | Borderou de evaluare (job #2683557) | Borderou de evaluare (job #276543) | Borderou de evaluare (job #1405963) | Cod sursa (job #2675851)
#include <stdio.h>
#include <ctype.h>
#define MAX_N 5000000//cea mai apropiata putere a lui 2 e 8,388,608 :(
int v[MAX_N][2];
int first, size;
FILE *fin, *fout;
int readInt() {
int ch, res = 0, semn = 1;
while ( isspace( ch = fgetc( fin ) ) );
if ( ch == '-' ) {
semn = -1;
ch = fgetc( fin );
}
do
res = 10 * res + ch - '0';
while ( isdigit( ch = fgetc( fin ) ) );
return semn * res;
}
int push_front(int val, int poz) {
if (size == MAX_N)
return 0;
if (size == 0)
first = 0;
else {
--first;
if (first == -1)
first = MAX_N - 1;
}
v[first][0] = val;
v[first][1] = poz;
++size;
return 1;
}
int push_back(int val, int poz) {
if (size == MAX_N)
return 0;
v[(first + size) % MAX_N][0] = val;
v[(first + size) % MAX_N][1] = poz;
++size;
return 1;
}
int pop_front() {
if (size == 0)
return 0;
++first;
if (first == MAX_N)
first = 0;
--size;
return 1;
}
int pop_back() {
if (size == 0)
return 0;
--size;
return 1;
}
int frontVal() {
return size > 0 ? v[first][0] : -1;
}
int backVal() {
return size > 0 ? v[(first + size - 1) % MAX_N][0] : -1;
}
int frontPoz() {
return size > 0 ? v[first][1] : -1;
}
int backPoz() {
return size > 0 ? v[(first + size - 1) % MAX_N][1] : -1;
}
int main() {
fin = fopen( "deque.in", "r" );
fout = fopen( "deque.out", "w" );
int i, n, k, a;
long long s;
fscanf( fin, "%d", &n );
fscanf( fin, "%d", &k );
for( i = 1; i <= k; i++ ) {
a = readInt();
while( size && backVal() > a ) {
pop_back();
}
push_back( a, i );
}
s = frontVal();
for( i = k + 1; i <= n; i++ ) {
a = readInt();
if( i - frontPoz() == k )
pop_front();
while( size && backVal() > a ) {
pop_back();
}
push_back( a, i );
s += frontVal();
}
fprintf( fout, "%lld", s );
return 0;
}