Cod sursa(job #2722447)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 12 martie 2021 20:50:14
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
//#include <iostream>
#define NQ 8388608
#define N 5000000
#define NMAX 10000000

using namespace std;

ifstream fin( "deque.in" );
ofstream fout( "deque.out" );

int dq[NQ + 1], v[N + 1];
int prim, ultim;

/*void afis( int a[], int st, int dr ) {
    cout << "dq: ";
    for ( int i = st; i < dr; i ++ )
        cout << a[i] << " ";
    cout << "\n";
}*/

int main() {
    int n, k;
    long long sum;
    fin >> n >> k;
    v[0] = -NMAX - 1;
    prim = ultim = 0;
    for ( int i = 1; i <= k; i ++ ) {
        fin >> v[i];
        while ( v[dq[( ultim + NQ - 1 ) % NQ]] >= v[i] ) {
            ultim = ( ultim + NQ - 1 ) % NQ;
        }
        dq[ultim] = i;
        ultim = ( ultim + 1 ) % NQ;
    }
    sum = v[dq[prim]];
    //cout << v[dq[prim]] << "\n";
    //afis( dq, prim, ultim );
    for ( int i = k + 1; i <= n; i ++ ) {
        fin >> v[i];
        if ( dq[prim] <= i - k ) {
            v[dq[prim]] = -NMAX - 1;
            prim = ( prim + 1 ) % NQ;
        }
        while ( v[dq[( ultim + NQ - 1 ) % NQ]] >= v[i] ) {
            ultim = ( ultim + NQ - 1 ) % NQ;
        }
        dq[ultim] = i;
        ultim = ( ultim + 1 ) % NQ;
        sum += v[dq[prim]];
        //cout << v[dq[prim]] << " " << prim << " " << ultim << "\n";
        //afis( dq, prim, ultim );
    }
    fout << sum << "\n";
    return 0;
}