Cod sursa(job #1160672)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 30 martie 2014 18:18:14
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#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;
}