Cod sursa(job #1095523)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 31 ianuarie 2014 12:41:36
Problema Deque Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <cstdio>
#include <deque>
#include <utility>

using namespace std;

void deque_add(deque<pair<int, int>>& d, int i, int x) {
  while(d.size() > 0 && d.back().second >= x) d.pop_back();
  d.push_back(make_pair(i, x));
}

void deque_del(deque<pair<int, int>>& d, int i, int K) {
  while(i - d.front().first >= K) d.pop_front();
}

int main(int argc, char *argv[]) {
  freopen("deque.in", "r", stdin);
  freopen("deque.out", "w", stdout);

  int N, K;
  scanf("%d%d", &N, &K);

  int *v = new int[N];
  for(int i = 0; i < N; ++i) {
    scanf("%d", v + i);
  }

  long long s = 0;
  deque<pair<int, int>> d;
  d.push_back(make_pair(0, v[0]));
  for(int i = 1; i < K; ++i) {
    deque_add(d, i, v[i]);
  }
  s += d.front().second;
  printf("%d ", d.front().second);
  for(int i = K; i < N; ++i) {
    deque_add(d, i, v[i]);
    deque_del(d, i, K);
    s += d.front().second;
    printf("%d ", d.front().second);
  }
  printf("\n");

  printf("%lld\n", s);
  return 0;
}