Problem p02549 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a), i##end = (b); i <= i##end; i++)
#define temT template <typename T>
using namespace std;
typedef long long ll;
const ll mo = 998244353;
const int N = int(2e5) + 10;

int n, K, a[11][2];

temT inline T add(T x, T y) { return (x += y, x >= mo) ? x -= mo : x; }
temT inline T dec(T x, T y) { return (x -= y, x < 0) ? x += mo : x; }
temT inline T mul(T x, T y) { return T((ll)x * y % mo); }

#define RT 1, 1, n
#define LS p << 1, l, mid
#define RS p << 1 | 1, mid + 1, r
int sum[N * 2], tag[N * 2];
void mt(int p) { sum[p] = add(sum[p << 1], sum[p << 1 | 1]); }
void fill(int p, int l, int r, int v) {
  sum[p] = add(sum[p], mul(r - l + 1, v));
  tag[p] = add(tag[p], v);
}
void pd(int p, int l, int r) {
  int mid = (l + r) >> 1;
  fill(LS, tag[p]);
  fill(RS, tag[p]);
  tag[p] = 0;
}
void upd(int p, int l, int r, int el, int er, int v) {
  if (el <= l && r <= er)
    return fill(p, l, r, v), void();
  pd(p, l, r);
  int mid = (l + r) >> 1;
  if (el <= mid)
    upd(LS, el, er, v);
  if (er >= mid + 1)
    upd(RS, el, er, v);
  mt(p);
}
int ask(int p, int l, int r, int ep) {
  if (l == r)
    return sum[p];
  pd(p, l, r);
  int mid = (l + r) >> 1;
  if (ep <= mid)
    return ask(LS, ep);
  if (ep >= mid + 1)
    return ask(RS, ep);
}

int main() {
  cin >> n >> K;
  FOR(i, 1, K) cin >> a[i][0] >> a[i][1];
  upd(RT, 1, 1, 1);
  FOR(i, 1, n - 1) {
    int x = ask(RT, i);
    FOR(j, 1, K) {
      int l = i + a[j][0], r = i + a[j][1];
      if (l > n)
        continue;
      l = min(l, n), r = min(r, n);
      upd(RT, l, r, x);
    }
  }
  cout << ask(RT, n);
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a), i##end = (b); i <= i##end; i++)
#define temT template <typename T>
using namespace std;
typedef long long ll;
const ll mo = 998244353;
const int N = int(2e5) + 10;

int n, K, a[11][2];

temT inline T add(T x, T y) { return (x += y, x >= mo) ? x -= mo : x; }
temT inline T dec(T x, T y) { return (x -= y, x < 0) ? x += mo : x; }
temT inline T mul(T x, T y) { return T((ll)x * y % mo); }

#define RT 1, 1, n
#define LS p << 1, l, mid
#define RS p << 1 | 1, mid + 1, r
int sum[N * 4], tag[N * 4];
void mt(int p) { sum[p] = add(sum[p << 1], sum[p << 1 | 1]); }
void fill(int p, int l, int r, int v) {
  sum[p] = add(sum[p], mul(r - l + 1, v));
  tag[p] = add(tag[p], v);
}
void pd(int p, int l, int r) {
  int mid = (l + r) >> 1;
  fill(LS, tag[p]);
  fill(RS, tag[p]);
  tag[p] = 0;
}
void upd(int p, int l, int r, int el, int er, int v) {
  if (el <= l && r <= er)
    return fill(p, l, r, v), void();
  pd(p, l, r);
  int mid = (l + r) >> 1;
  if (el <= mid)
    upd(LS, el, er, v);
  if (er >= mid + 1)
    upd(RS, el, er, v);
  mt(p);
}
int ask(int p, int l, int r, int ep) {
  if (l == r)
    return sum[p];
  pd(p, l, r);
  int mid = (l + r) >> 1;
  if (ep <= mid)
    return ask(LS, ep);
  if (ep >= mid + 1)
    return ask(RS, ep);
}

int main() {
  cin >> n >> K;
  FOR(i, 1, K) cin >> a[i][0] >> a[i][1];
  upd(RT, 1, 1, 1);
  FOR(i, 1, n - 1) {
    int x = ask(RT, i);
    FOR(j, 1, K) {
      int l = i + a[j][0], r = i + a[j][1];
      if (l > n)
        continue;
      l = min(l, n), r = min(r, n);
      upd(RT, l, r, x);
    }
  }
  cout << ask(RT, n);
  return 0;
}