Problem p03202 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define Fast_IO ios::sync_with_stdio(false);
#define DEBUG                                                                  \
  fprintf(stderr, "Running on Line %d in Function %s\n", __LINE__, __FUNCTION__)
// mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
#define fir first
#define sec second
#define mod 998244353
#define ll long long
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
inline int read() {
  char ch = getchar();
  int nega = 1;
  while (!isdigit(ch)) {
    if (ch == '-')
      nega = -1;
    ch = getchar();
  }
  int ans = 0;
  while (isdigit(ch)) {
    ans = ans * 10 + ch - 48;
    ch = getchar();
  }
  if (nega == -1)
    return -ans;
  return ans;
}
typedef pair<int, int> pii;
#define N 100005
int a[N], n;
bool chk(int mid) {
  stack<pii> s;
  s.emplace(0, 0);
  for (int i = 1; i <= n; i++) {
    if (a[i] > a[i - 1])
      continue;
    while (s.top().fir > a[i])
      s.pop();
    int val = a[i];
    while (s.top().fir == val && s.top().sec == mid - 1) {
      s.pop();
      val--;
    }
    if (!val)
      return 0;
    if (s.top().fir == val) {
      auto [v, w] = s.top();
      s.pop();
      s.emplace(v, w + 1);
    } else
      s.emplace(val, 1);
  }
  return 1;
}
signed main() {
  cin >> n;
  for (int i = 1; i <= n; i++)
    a[i] = read();
  bool ok = 1;
  for (int i = 1; i <= n; i++)
    ok &= (a[i] > a[i - 1]);
  if (ok) {
    cout << 1 << endl;
    return 0;
  }
  int l = 2, r = n, ans;
  while (l <= r) {
    int mid = (l + r) / 2;
    if (chk(mid))
      ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  cout << ans << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define Fast_IO ios::sync_with_stdio(false);
#define DEBUG                                                                  \
  fprintf(stderr, "Running on Line %d in Function %s\n", __LINE__, __FUNCTION__)
// mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
#define fir first
#define sec second
#define mod 998244353
#define ll long long
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
inline int read() {
  char ch = getchar();
  int nega = 1;
  while (!isdigit(ch)) {
    if (ch == '-')
      nega = -1;
    ch = getchar();
  }
  int ans = 0;
  while (isdigit(ch)) {
    ans = ans * 10 + ch - 48;
    ch = getchar();
  }
  if (nega == -1)
    return -ans;
  return ans;
}
typedef pair<int, int> pii;
#define N 200005
int a[N], n;
bool chk(int mid) {
  stack<pii> s;
  s.emplace(0, 0);
  for (int i = 1; i <= n; i++) {
    if (a[i] > a[i - 1])
      continue;
    while (s.top().fir > a[i])
      s.pop();
    int val = a[i];
    while (s.top().fir == val && s.top().sec == mid - 1) {
      s.pop();
      val--;
    }
    if (!val)
      return 0;
    if (s.top().fir == val) {
      auto [v, w] = s.top();
      s.pop();
      s.emplace(v, w + 1);
    } else
      s.emplace(val, 1);
  }
  return 1;
}
signed main() {
  cin >> n;
  for (int i = 1; i <= n; i++)
    a[i] = read();
  bool ok = 1;
  for (int i = 1; i <= n; i++)
    ok &= (a[i] > a[i - 1]);
  if (ok) {
    cout << 1 << endl;
    return 0;
  }
  int l = 2, r = n, ans;
  while (l <= r) {
    int mid = (l + r) / 2;
    if (chk(mid))
      ans = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  cout << ans << endl;
  return 0;
}