Cod sursa(job #3324513)

Utilizator ultra980Alex Stan ultra980 Data 22 noiembrie 2025 12:07:40
Problema Deque Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <algorithm>
#include <fstream>
#include <cassert>

const int MAXNK = 5e6, QSIZE = (1 << 23), MAXVAL = 1e7;

class Deque {
  private:
    int arr[QSIZE];
    int qs = 0, qe = 0;
  public:
    const int ERR = MAXVAL + 1;

    Deque() {
      // QSIZE trebuie sa fie o putere de 2 ca sa mearga operatiile bitwise
      assert(!(QSIZE & (QSIZE - 1))); 
    }

    bool empty() {
      return qs == qe;
    }
    
    int front() {
      if (empty()) {
        return ERR;
      }
      return arr[qs];
    }

    int back() {
      if (empty()) {
        return ERR;
      }
      return arr[(qe - 1 + QSIZE) & (QSIZE - 1)];
    }

    void push_front(int val) {
      arr[qs = ((qs - 1 + QSIZE) & (QSIZE - 1))] = val;
    }

    void push_back(int val) {
      arr[qe] = val;
      qe = (qe + 1) & (QSIZE - 1);
    }

    void pop_front() {
      qs = (qs + 1) & (QSIZE - 1);
    }

    void pop_back() {
      qe = (qe - 1 + QSIZE) & (QSIZE - 1);
    }
} deque;

std::ifstream fin;
std::ofstream fout;

int n, k;
int nums[MAXNK];

void read_input() {
  fin.open("deque.in");
  fin >> n >> k;
  for (int i = 0; i < n; ++i) {
    fin >> nums[i];
  }
  fin.close();
}

long long int calc_sum() {
  long long int min_sum = 0;
  int i;

  // tin doar indicii din vector in coada
  for (i = 0; i < k; ++i) {
    while (!deque.empty() && nums[deque.back()] >= nums[i]) {
      deque.pop_back();
    }
    deque.push_back(i);
  }
  
  min_sum = nums[deque.front()];

  for (i = 1; i + k - 1 < n; ++i) {
    if (deque.front() == i - 1) { // minimul e numarul care iese din secventa
      deque.pop_front();
    }
    
    while (!deque.empty() && nums[deque.back()] >= nums[i + k - 1]) {
      deque.pop_back();
    }
    deque.push_back(i + k - 1);
    min_sum += nums[deque.front()];
  }

  return min_sum;
}

int main() {
  read_input();
  
  fout.open("deque.out");
  fout << calc_sum() << '\n';
  fout.close();

  return 0;
}