Problem p04023 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <array>
#include <bitset>
#include <chrono>
#include <cmath>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef unsigned long long int ulint;
typedef long long int llint;
typedef long double lldo;
#define mp make_pair
#define mt make_tuple
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define fir first
#define sec second
#define res resize
#define ins insert
#define era erase
#define RE return 0
// ios::sync_with_stdio(false);
// std::cin.tie(0);
//<< setprecision(20)
const int mod = (int)1e9 + 7;
const llint big = (llint)44e12; // ごめん
const long double pai = 3.141592653589793238462643383279502884197;
const long double ena = 2.71828182845904523536;
const long double eps = 1e-7;
template <class T, class U> void mineq(T &a, U b) {
  if (a > b) {
    a = b;
  }
}
template <class T, class U> void maxeq(T &a, U b) {
  if (a < b) {
    a = b;
  }
}
template <class T> void soun(T &ar) {
  sort(ar.begin(), ar.end());
  ar.erase(unique(ar.begin(), ar.end()), ar.end());
}
llint gcd(llint a, llint b) {
  if (a % b == 0) {
    return b;
  } else {
    return gcd(b, a % b);
  }
}
llint lcm(llint a, llint b) { return a / gcd(a, b) * b; }
template <class T, class U> auto LB(T &ve, U in) {
  return lower_bound(ve.begin(), ve.end(), in);
}
template <class T, class U> auto UB(T &ve, U in) {
  return upper_bound(ve.begin(), ve.end(), in);
}
template <class T, class U> auto LBI(T &ve, U in) {
  return LB(ve, in) - ve.begin();
}
template <class T, class U> auto UBI(T &ve, U in) {
  return UB(ve, in) - ve.begin();
}
template <class T> void SO(T &ve) { sort(ve.begin(), ve.end()); }
template <class T> void REV(T &ve) { reverse(ve.begin(), ve.end()); }
int main(void) {
  // 適当にやってもそんなに大きくならない説
  ios::sync_with_stdio(false);
  std::cin.tie(0);
  llint n, q, i;
  cin >> n >> q;
  llint oldn = n;
  vector<llint> kaz;
  kaz.pub(n);
  for (i = 0; i < q; i++) {
    llint a;
    cin >> a;
    while (kaz.size() > 0 && kaz.back() >= a) {
      kaz.pob();
    }
    kaz.pub(a);
  }
  // for(auto it:kaz){cerr<<it<<" ";}cerr<<endl;
  // kazは操作の列単調増加
  llint m = kaz.size();
  n = kaz[0];
  vector<llint> kri(m + 1); // kri回だけ加算
  vector<llint> wa(n + 2);
  kri[m - 1] = 1;
  for (i = m - 1; i > 0; i--) {
    if (kri[i] == 0) {
      continue;
    }
    llint gen = kaz[i];
    int mae = i;
    while (gen >= n) {
      llint bas =
          lower_bound(kaz.begin(), kaz.begin() + mae, gen) - kaz.begin() - 1;
      kri[bas] += kri[i] * (gen / kaz[bas]); // 1以上
      gen %= kaz[bas];
      mae = bas;
    }
    wa[gen] += kri[i];
  }
  wa[n] += kri[0];
  for (i = n - 1; i >= 0; i--) {
    wa[i] += wa[i + 1];
  }
  for (i = 1; i <= n; i++) {
    cout << wa[i] << "\n";
  }
  for (i = n + 1; i <= oldn; i++) {
    cout << 0 << "\n";
  }
  RE;
}


Fixed submission:
#include <algorithm>
#include <array>
#include <bitset>
#include <chrono>
#include <cmath>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <string>
#include <tuple>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef unsigned long long int ulint;
typedef long long int llint;
typedef long double lldo;
#define mp make_pair
#define mt make_tuple
#define pub push_back
#define puf push_front
#define pob pop_back
#define pof pop_front
#define fir first
#define sec second
#define res resize
#define ins insert
#define era erase
#define RE return 0
// ios::sync_with_stdio(false);
// std::cin.tie(0);
//<< setprecision(20)
const int mod = (int)1e9 + 7;
const llint big = (llint)44e12; // ごめん
const long double pai = 3.141592653589793238462643383279502884197;
const long double ena = 2.71828182845904523536;
const long double eps = 1e-7;
template <class T, class U> void mineq(T &a, U b) {
  if (a > b) {
    a = b;
  }
}
template <class T, class U> void maxeq(T &a, U b) {
  if (a < b) {
    a = b;
  }
}
template <class T> void soun(T &ar) {
  sort(ar.begin(), ar.end());
  ar.erase(unique(ar.begin(), ar.end()), ar.end());
}
llint gcd(llint a, llint b) {
  if (a % b == 0) {
    return b;
  } else {
    return gcd(b, a % b);
  }
}
llint lcm(llint a, llint b) { return a / gcd(a, b) * b; }
template <class T, class U> auto LB(T &ve, U in) {
  return lower_bound(ve.begin(), ve.end(), in);
}
template <class T, class U> auto UB(T &ve, U in) {
  return upper_bound(ve.begin(), ve.end(), in);
}
template <class T, class U> auto LBI(T &ve, U in) {
  return LB(ve, in) - ve.begin();
}
template <class T, class U> auto UBI(T &ve, U in) {
  return UB(ve, in) - ve.begin();
}
template <class T> void SO(T &ve) { sort(ve.begin(), ve.end()); }
template <class T> void REV(T &ve) { reverse(ve.begin(), ve.end()); }
int main(void) {
  // 適当にやってもそんなに大きくならない説
  ios::sync_with_stdio(false);
  std::cin.tie(0);
  llint n, q, i;
  cin >> n >> q;
  llint oldn = n;
  vector<llint> kaz;
  kaz.pub(n);
  for (i = 0; i < q; i++) {
    llint a;
    cin >> a;
    while (kaz.size() > 0 && kaz.back() >= a) {
      kaz.pob();
    }
    kaz.pub(a);
  }
  // for(auto it:kaz){cerr<<it<<" ";}cerr<<endl;
  // kazは操作の列単調増加
  llint m = kaz.size();
  n = kaz[0];
  vector<llint> kri(m + 1); // kri回だけ加算
  vector<llint> wa(n + 2);
  kri[m - 1] = 1;
  for (i = m - 1; i > 0; i--) {
    if (kri[i] == 0) {
      continue;
    }
    llint gen = kaz[i];
    int mae = i;
    while (gen > n) {
      llint bas =
          lower_bound(kaz.begin(), kaz.begin() + mae, gen) - kaz.begin() - 1;
      kri[bas] += kri[i] * (gen / kaz[bas]); // 1以上
      gen %= kaz[bas];
      mae = bas;
    }
    wa[gen] += kri[i];
  }
  wa[n] += kri[0];
  for (i = n - 1; i >= 0; i--) {
    wa[i] += wa[i + 1];
  }
  for (i = 1; i <= n; i++) {
    cout << wa[i] << "\n";
  }
  for (i = n + 1; i <= oldn; i++) {
    cout << 0 << "\n";
  }
  RE;
}