Pagini recente » Cod sursa (job #379809) | Cod sursa (job #721209) | Cod sursa (job #621183) | Cod sursa (job #1979380) | Cod sursa (job #1160672)
#include <cstdio>
#include <deque>
#define MAXN 1000000
using namespace std;
int v[MAXN], n, k;
deque <int> MAX;
deque <int> MIN;
inline bool check( int len ) {
// int dif;
while( !MAX.empty() )
MAX.pop_back();
while( !MIN.empty() )
MIN.pop_back();
MAX.push_back( 0 );
MIN.push_back( 0 );
for( int i = 1 ; i < n ; ++i ) {
if( i - MAX.front() == len )
MAX.pop_front();
if( i - MIN.front() == len )
MIN.pop_front();
while( !MAX.empty() && v[i] > v[MAX.back()] )
MAX.pop_back();
MAX.push_back( i );
while( !MIN.empty() && v[i] < v[MIN.back()] )
MIN.pop_back();
MIN.push_back( i );
// dif = v[MAX.front()] - v[MIN.front()];
if( i >= len - 1 && v[MAX.front()] - v[MIN.front()] <= k )
return true;
}
return false;
}
int main () {
FILE *f, *g;
f = fopen( "secvdist.in", "r" );
g = fopen( "secvdist.out", "w" );
fscanf( f, "%d%d", &n, &k );
for( int i = 0 ; i < n ; ++i )
fscanf( f, "%d", &v[i] );
int st = 0, dr = n, m;
while( dr - st > 1 ) {
m = ( st + dr ) >> 1;
if( check( m ) )
st = m;
else
dr = m;
}
if( check( dr ) )
fprintf( g, "%d\n", dr );
else if( check(st) )
fprintf( g, "%d\n", st );
else
fprintf( g, "0\n" );
fclose( f );
fclose( g );
return 0;
}