Pagini recente » Cod sursa (job #671691) | Cod sursa (job #233364) | Cod sursa (job #207418) | Cod sursa (job #1481453) | Cod sursa (job #2675849)
#include <stdio.h>
#define MAX_N 5000000//cea mai apropiata putere a lui 2 e 8,388,608 :(
int v[MAX_N][2];
int first, size;
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() {
FILE *fin, *fout;
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++ ) {
fscanf( fin, "%d", &a );
while( size && backVal() > a ) {
pop_back();
}
push_back( a, i );
}
s = frontVal();
for( i = k + 1; i <= n; i++ ) {
fscanf( fin, "%d", &a );
if( i - frontPoz() == k )
pop_front();
while( size && backVal() > a ) {
pop_back();
}
push_back( a, i );
s += frontVal();
}
fprintf( fout, "%lld", s );
return 0;
}