Problem p02549 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define MOD 998244353
typedef long long ll;
using namespace std;
struct mint {
  ll x;
  mint(ll x = 0) : x((x % MOD + MOD) % MOD) {}
  mint operator-() { return mint(-x); }
  mint operator+=(mint rhs) {
    x += rhs.x;
    if (x >= MOD)
      x -= MOD;
    return *this;
  }
  mint operator-=(mint rhs) {
    x -= rhs.x;
    if (x < 0)
      x += MOD;
    return *this;
  }
  mint operator*=(mint rhs) {
    x = x * rhs.x % MOD;
    return *this;
  }
  mint operator+(mint rhs) { return mint(*this) += rhs; }
  mint operator-(mint rhs) { return mint(*this) -= rhs; }
  mint operator*(mint rhs) { return mint(*this) *= rhs; }
};
// ostream &operator<<(ostream &os, const mint &dt) {
// 	os << dt.x;
// 	return os;
// }
int main() {
  int n, k;
  cin >> n >> k;
  vector<int> l(k), r(k);
  for (int i = 0; i < k; i++) {
    cin >> l[i] >> r[i];
  }
  vector<mint> dp(n + 10, 0);
  vector<mint> sum(n + 10, 0);
  dp[0] = 1;
  mint p = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < k; j++) {
      // if (i + l[j] > n + 1) continue;
      sum[i + l[j]] += dp[i];
      sum[i + r[j] + 1] -= dp[i];
    }
    p += sum[i + 1];
    dp[i + 1] = p;
    // cout << "p:" << p << endl;
    // cout << "sum:";
    // for (int ii = 0; ii <= n; ii++) {
    // 	cout << sum[ii];
    // 	if (ii == n)
    // 		cout << endl;
    // 	else
    // 		cout << " ";
    // }
    // cout << "dp:";
    // for (int ii = 0; ii <= n; ii++) {
    // 	cout << dp[ii];
    // 	if (ii == n)
    // 		cout << endl;
    // 	else
    // 		cout << " ";
    // }
  }
  // for (int i = 0; i <= n; i++) {
  // 	cout << dp[i];
  // 	if (i == n)
  // 		cout << endl;
  // 	else
  // 		cout << " ";
  // }
  cout << dp[n - 1].x << endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#define MOD 998244353
typedef long long ll;
using namespace std;
struct mint {
  ll x;
  mint(ll x = 0) : x((x % MOD + MOD) % MOD) {}
  mint operator-() { return mint(-x); }
  mint operator+=(mint rhs) {
    x += rhs.x;
    if (x >= MOD)
      x -= MOD;
    return *this;
  }
  mint operator-=(mint rhs) {
    x -= rhs.x;
    if (x < 0)
      x += MOD;
    return *this;
  }
  mint operator*=(mint rhs) {
    x = x * rhs.x % MOD;
    return *this;
  }
  mint operator+(mint rhs) { return mint(*this) += rhs; }
  mint operator-(mint rhs) { return mint(*this) -= rhs; }
  mint operator*(mint rhs) { return mint(*this) *= rhs; }
};
// ostream &operator<<(ostream &os, const mint &dt) {
// 	os << dt.x;
// 	return os;
// }
int main() {
  int n, k;
  cin >> n >> k;
  vector<int> l(k), r(k);
  for (int i = 0; i < k; i++) {
    cin >> l[i] >> r[i];
  }
  vector<mint> dp(n + 10, 0);
  vector<mint> sum(n + 10, 0);
  dp[0] = 1;
  mint p = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < k; j++) {
      if (i + l[j] <= n + 1)
        sum[i + l[j]] += dp[i];
      if (i + r[j] + 1 <= n + 1)
        sum[i + r[j] + 1] -= dp[i];
    }
    p += sum[i + 1];
    dp[i + 1] = p;
    // cout << "p:" << p << endl;
    // cout << "sum:";
    // for (int ii = 0; ii <= n; ii++) {
    // 	cout << sum[ii];
    // 	if (ii == n)
    // 		cout << endl;
    // 	else
    // 		cout << " ";
    // }
    // cout << "dp:";
    // for (int ii = 0; ii <= n; ii++) {
    // 	cout << dp[ii];
    // 	if (ii == n)
    // 		cout << endl;
    // 	else
    // 		cout << " ";
    // }
  }
  // for (int i = 0; i <= n; i++) {
  // 	cout << dp[i];
  // 	if (i == n)
  // 		cout << endl;
  // 	else
  // 		cout << " ";
  // }
  cout << dp[n - 1].x << endl;
  return 0;
}