Problem p02904 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

#define INF ((int)1e9)
#define INFLL ((ll)1e18)
#define MOD (1000000007LL)

int main(int argc, const char *argv[]) {
  ios_base::sync_with_stdio(false);
  int N, K;
  cin >> N >> K;
  vector<int> P(N);
  for (int n = 0; n < N; ++n)
    cin >> P[n];

  if (N == K) {
    cout << 1 << endl;
    return 0;
  }

  vector<int> vnMin(N - K), vnMax(N - K);
  deque<int> deqMin, deqMax;
  for (int n = 0; n < N; ++n) {
    while (!deqMin.empty()) {
      if (P[deqMin.back()] > P[n]) {
        deqMin.pop_back();
      } else {
        break;
      }
    }
    deqMin.push_back(n);
    if (n >= K) {
      vnMin[n - K] = P[deqMin[0]];
      if (deqMin.front() == n - K) {
        deqMin.pop_front();
      }
    }

    while (!deqMax.empty()) {
      if (P[deqMax.back()] < P[n]) {
        deqMax.pop_back();
      } else {
        break;
      }
    }
    deqMax.push_back(n);
    if (n >= K) {
      vnMax[n - K] = P[deqMax[0]];
      if (deqMax.front() == n - K) {
        deqMax.pop_front();
      }
    }
  }

  int nCount = 0;
  int nOrigInc = 0;
  vector<int> vnOrigInc(N - K, 0);
  for (int n = 0; n < N - 1; ++n) {
    if (P[n] < P[n + 1]) {
      ++nCount;
    }
    if (n >= K - 1 && P[n - K + 1] < P[n - K + 2]) {
      --nCount;
    }
    if (nCount == K - 1) {
      ++nOrigInc;
      vnOrigInc[n - K + 2] = 1;
    }
  }

  int nRes = N - K + 1;
  for (int n = 0; n + K < N; ++n) {
    if (!vnOrigInc[n] && P[n] == vnMin[n] && P[n + K] == vnMax[n]) {
      --nRes;
    }
  }

  if (nOrigInc > 1) {
    nRes -= (nOrigInc - 1);
  }
  cout << nRes << endl;

  return 0;
}


Fixed submission:
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

#define INF ((int)1e9)
#define INFLL ((ll)1e18)
#define MOD (1000000007LL)

int main(int argc, const char *argv[]) {
  ios_base::sync_with_stdio(false);
  int N, K;
  cin >> N >> K;
  vector<int> P(N);
  for (int n = 0; n < N; ++n)
    cin >> P[n];

  if (N == K) {
    cout << 1 << endl;
    return 0;
  }

  vector<int> vnMin(N - K), vnMax(N - K);
  deque<int> deqMin, deqMax;
  for (int n = 0; n < N; ++n) {
    while (!deqMin.empty()) {
      if (P[deqMin.back()] > P[n]) {
        deqMin.pop_back();
      } else {
        break;
      }
    }
    deqMin.push_back(n);
    if (n >= K) {
      vnMin[n - K] = P[deqMin[0]];
      if (deqMin.front() == n - K) {
        deqMin.pop_front();
      }
    }

    while (!deqMax.empty()) {
      if (P[deqMax.back()] < P[n]) {
        deqMax.pop_back();
      } else {
        break;
      }
    }
    deqMax.push_back(n);
    if (n >= K) {
      vnMax[n - K] = P[deqMax[0]];
      if (deqMax.front() == n - K) {
        deqMax.pop_front();
      }
    }
  }

  int nCount = 0;
  int nOrigInc = 0;
  vector<int> vnOrigInc(N - K + 1, 0);
  for (int n = 0; n < N - 1; ++n) {
    if (P[n] < P[n + 1]) {
      ++nCount;
    }
    if (n >= K - 1 && P[n - K + 1] < P[n - K + 2]) {
      --nCount;
    }
    if (nCount == K - 1) {
      ++nOrigInc;
      vnOrigInc[n - K + 2] = 1;
    }
  }

  int nRes = N - K + 1;
  for (int n = 0; n + K < N; ++n) {
    if (!vnOrigInc[n] && P[n] == vnMin[n] && P[n + K] == vnMax[n]) {
      --nRes;
    }
  }

  if (nOrigInc > 1) {
    nRes -= (nOrigInc - 1);
  }
  cout << nRes << endl;

  return 0;
}