Cod sursa(job #1701075)

Utilizator TincaMateiTinca Matei TincaMatei Data 12 mai 2016 08:43:10
Problema Deque Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <cstdio>

const int MAX_N = 5000000;
int v[MAX_N];

struct Deque {
  int front, top, size;
  int d[MAX_N];
  Deque() {
    front = top = size = 0;
  }
  void push_top(int val) {
    d[top%MAX_N] = val;
    top++;
    size++;
  }
  void pop_top() {
    top--;
    size--;
  }
  void push_front(int val) {
    front--;
    d[(front + MAX_N)%MAX_N] = val;
    size++;
  }
  void pop_front() {
    front++;
  }
  int getSize() {
    return size;
  }
  int getTop() {
    return d[(top - 1) % MAX_N];
  }
  int getFront() {
    return d[(front + MAX_N) % MAX_N];
  }
};

int main() {
  int n, k, i;
  long long s;
  Deque* myDeque = new Deque;
  FILE *fin = fopen("deque.in", "r");
  fscanf(fin, "%d%d", &n, &k);
  for(i = 0; i < n; i++)
    fscanf(fin, "%d", &v[i]);
  fclose(fin);
  s = 0LL;
  for(i = 0; i < n; i++) {
    while(myDeque->getSize() > 0 && myDeque->getTop() > v[i])
      myDeque->pop_top();
    myDeque->push_top(v[i]);
    if(i >= k && myDeque->getFront() == v[i - k])
      myDeque->pop_front();
    if(i >= k - 1)
      s = s + myDeque->getFront();
  }

  FILE *fout = fopen("deque.out", "w");
  fprintf(fout, "%lld", s);
  fclose(fout);
  return 0;
}