Cod sursa(job #2030807)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 2 octombrie 2017 12:15:28
Problema Secventa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.25 kb
/*//#include <cstdio>
#include <fstream>
using namespace std;
int n,i,v[500001],k,p,j,u,maxim,x,p1,p2,k2,d[500001];
//FILE *fin = fopen ("secventa.in", "r");
//FILE *fout = fopen ("secventa.out", "w");
class inputReader {

private:

    FILE *inputFile;
    static const int SIZE = 1 << 12;
    char buffer[SIZE]; int cursor;

    inline void advance( void ) {
        if( ++cursor == SIZE ) {
            cursor = 0;
            fread( buffer, SIZE, 1, inputFile );
        } return;
    }

    inline char current( void ) {
        return buffer[cursor];
    }

public:

    inputReader( const char *fileName ) {
        inputFile = fopen( fileName, "r" ); cursor = 0;
        fread( buffer, SIZE, 1, inputFile );
    }

    inputReader &operator >>( int &value ) {
        value = 0;

        while( current() < '0' || current() > '9' )
            advance();

        while( current() >= '0' && current() <= '9' ) {
            value = value * 10 + ( current() - '0' );
            advance();
        }

        return *this;
    }

} fin( "secventa.in" );
ofstream fout( "secventa.out" );
int main (){

    //fscanf (fin, "%d%d",&n, &k);
    fin>>n>>k;
    for (i=1;i<=n;i++)
        fin>>v[i];
        //fscanf (fin, "%d", &v[i]);
    p = 1;
    u = 1;
    d[1] = 1;
    maxim = -2000000;
    for (i=2;i<=n;i++){
        while (p<=u && v[i] < v[d[u]])
            u--;
        d[++u] = i;
        if (i-d[p] == k)
            p++;
        if (i>=k && v[d[p]] > maxim){
            maxim = v[d[p]];
            p1 = i-k+1;
            p2 = i;
        }

    }
    //fprintf (fout, "%d %d %d",p1,p2,maxim);
    fout<<p1<<" "<<p2<<" "<<maxim;

    return 0;
}
*/
#include <fstream>

using namespace std;

int n,i,v[500001],k,p,j,u,maxim,x,p1,p2,k2,d[500001];

//ifstream fin ("secventa.in");
//ofstream fout ("secventa.out");
class inputReader {

private:

    FILE *inputFile;
    static const int SIZE = 1 << 12;
    char buffer[SIZE]; int cursor;

    inline void advance( void ) {
        if( ++cursor == SIZE ) {
            cursor = 0;
            fread( buffer, SIZE, 1, inputFile );
        } return;
    }

    inline char current( void ) {
        return buffer[cursor];
    }

public:

    inputReader( const char *fileName ) {
        inputFile = fopen( fileName, "r" ); cursor = 0;
        fread( buffer, SIZE, 1, inputFile );
    }

    inputReader &operator >>( int &value ) {
        value = 0;

        while( current() < '0' || current() > '9' )
            advance();

        while( current() >= '0' && current() <= '9' ) {
            value = value * 10 + ( current() - '0' );
            advance();
        }

        return *this;
    }

} fin( "secventa.in" );
ofstream fout( "secventa.out" );
int main (){

    fin>>n>>k;
    for (i=1;i<=n;i++)
        fin>>v[i];

    p = 1;
    u = 1;
    d[1] = 1;
    maxim = -2000000000;
    for (i=2;i<=n;i++){
        while (p<=u && v[i] <= v[d[u]])
            u--;
        d[++u] = i;
        if (i-d[p] == k)
            p++;
        if (i>=k && v[d[p]] > maxim){
            maxim = v[d[p]];
            p1 = i-k+1;
            p2 = i;
        }

    }
    fout<<p1<<" "<<p2<<" "<<maxim;

    return 0;
}