Cod sursa(job #2180867)

Utilizator 24601Dan Ban 24601 Data 21 martie 2018 11:38:10
Problema Deque Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define SIZE 5000000
#define CHUNK (1 << 25)

struct dqe {
    int x;
    int i;
};

static struct dqe dq[SIZE];
static char buf[CHUNK];
static ssize_t blen, bpos = CHUNK;

static inline int read_int(int end)
{
    int x = 0, sgn = 1;

    while (1) {
        if (bpos == CHUNK) {
            blen = read(0, buf, CHUNK);
            bpos = 0;
        }

        if (buf[bpos] == '-') {
            sgn = -1;
        } else if ('0' <= buf[bpos] && buf[bpos] <= '9') {
            x = x * 10 + (buf[bpos] - '0');
        } else if (buf[bpos] == end) {
            bpos++;
            return sgn * x;
        }

        bpos++;
    }
}

int main(void)
{
    int n, k, x, i, t, h;
    long long r;

    freopen("deque.in", "r", stdin);
    freopen("deque.out", "w", stdout);

    n = read_int(' ');
    k = read_int('\n');

    t = h = 0;
    r = 0;

    for (i = 0; i < n; i++) {
        x = read_int('\n');

        while (t - 1 >= h && dq[t-1].x >= x) {
            t--;
        }

        dq[t].x = x;
        dq[t].i = i;
        t++;

        if (i - k >= dq[h].i) {
            h++;
        }

        if (i >= k - 1) {
            r += dq[h].x;
        }
    }

    printf("%lld\n", r);

    return 0;
}