Pagini recente » Cod sursa (job #3190759) | Cod sursa (job #732595) | Cod sursa (job #2589675) | Cod sursa (job #2386775) | Cod sursa (job #2669216)
// Mihai Priboi
#include <bits/stdc++.h>
#define MAXN 5000000
#define MAXX 10000000
// Aveam struct, dar imi dadea eroare din cauza ca MAXN ul este prea mare
int arr[MAXN], arr_ind[MAXN];
int arr_size = 0, arr_start = 0, arr_end = 0;
void push_front( int x, int i ) {
if( arr_size == 0 ) {
arr_start = arr_end = 0;
}
else {
if( arr_start == 0 )
arr_start = MAXN;
arr_start--;
}
arr[arr_start] = x;
arr_ind[arr_start] = i;
arr_size++;
}
void push_back( int x, int i ) {
if( arr_size == 0 ) {
arr_start = arr_end = 0;
}
else {
arr_end++;
if( arr_end == MAXN )
arr_end = 0;
}
arr[arr_end] = x;
arr_ind[arr_end] = i;
arr_size++;
}
int front( int *x, int *i ) {
if( arr_size == 0 ) {
*x = -MAXX - 1;
*i = -1;
return -1;
}
*i = arr_ind[arr_start];
*x = arr[arr_start];
return arr_size;
}
int end( int *x, int *i ) {
if( arr_size == 0 ) {
*x = MAXX + 1;
*i = MAXN;
return -1;
}
*i = arr_ind[arr_end];
*x = arr[arr_end];
return arr_size;
}
int pop_front() {
if( arr_size == 0 )
return -1;
arr_size--;
arr_start++;
if( arr_start == MAXN )
arr_start = 0;
return arr_size;
}
int pop_back() {
if( arr_size == 0 )
return -1;
arr_size--;
arr_end--;
if( arr_end == -1 )
arr_end = MAXN - 1;
return arr_size;
}
int size() {
return arr_size;
}
int main() {
FILE *fin, *fout;
int n, k, x, val, ind, i;
long long sum;
fin = fopen( "deque.in", "r" );
fscanf( fin, "%d%d", &n, &k );
sum = 0;
for( i = 0; i < k - 1; i++ ) {
fscanf( fin, "%d", &x );
front( &val, &ind );
while( val >= x ) {
pop_front();
front( &val, &ind );
}
push_front( x, i );
}
for( ; i < n; i++ ) {
fscanf( fin, "%d", &x );
front( &val, &ind );
while( val >= x ) {
pop_front();
front( &val, &ind );
}
push_front( x, i );
end( &val, &ind );
while( ind <= i - k ) {
pop_back();
end( &val, &ind );
}
sum += val;
}
fclose( fin );
fout = fopen( "deque.out", "w" );
fprintf( fout, "%lld", sum );
fclose( fout );
return 0;
}