Problem p02549 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <array>
#include <assert.h>
#include <bitset>
#include <chrono>
#include <climits>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define rep(i, a, b) for (int i = a; i < (b); i++)
#define forn(i, a) for (int i = 0; i < (a); i++)
#define repd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define ford(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)
#define int long long
#define ii pair<int, int>
#define ar array
#define FAST_IO                                                                \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL)
#define ms(x, a) memset(x, (int)(a), sizeof(x))
#define sz(x) ((int)(x).size())
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define pb push_back
#define endl '\\n'
#define ff first
#define ss second

const int N = 2e5 + 7;
const int MOD = 998244353;
int n, k;
int m;
vector<ii> a;
class Fenwick {
public:
  vector<int> ft;
  void init(int n) { ft.resize(n + 1); }
  int g(int x) { return x & (-x); }
  void get(int &x, int y) { // change it
    x += y;
    x += MOD;
    x %= MOD;
  }
  int sum(int pos) {
    int ans = 0;
    for (; pos; pos -= g(pos))
      get(ans, ft[pos]);
    return ans;
  }
  int sum(int l, int r) { return sum(r) - (l == 0 ? 0 : sum(l - 1)); }
  void upd(int pos, int val) {
    for (; pos < ft.size(); pos += g(pos)) {
      get(ft[pos], val);
    }
  }
};

void solve() {
  cin >> n >> k;
  a.resize(k);
  forn(i, k) { cin >> a[i].ff >> a[i].ss; }
  sort(all(a));
  Fenwick ft;
  ft.init(4 * N);
  ft.upd(1, 1);
  ft.upd(2, -1);
  for (int i = 1; i < n; i++) {
    int here = ft.sum(i);
    for (auto [x, y] : a) {
      int l = i + x;
      int r = i + y;
      int left = min(l, r);
      int right = max(l, r) + 1;
      ft.upd(left, here);
      ft.upd(right, -here);
    }
  }
  cout << ft.sum(1, n) % MOD << endl;
}

int32_t main() {
  FAST_IO;
  int t = 1;
  //    cin >> t ;
  while (t--) {
    solve();
  }
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <array>
#include <assert.h>
#include <bitset>
#include <chrono>
#include <climits>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define rep(i, a, b) for (int i = a; i < (b); i++)
#define forn(i, a) for (int i = 0; i < (a); i++)
#define repd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define ford(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)
#define int long long
#define ii pair<int, int>
#define ar array
#define FAST_IO                                                                \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL)
#define ms(x, a) memset(x, (int)(a), sizeof(x))
#define sz(x) ((int)(x).size())
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define pb push_back
#define endl '\\n'
#define ff first
#define ss second
// const int INF = 1e18 ;
// const int MOD = 1e9 + 7 ;
vector<int> fact;
vector<int> ifact;
vector<int> inv;
vector<int> pow2;
const int MOD = 998244353;
int add(int a, int b) {
  a += b;
  while (a >= MOD)
    a -= MOD;
  return a;
}
void radd(int &a, int b) { a = add(a, b); }
int mult(int a, int b) { return (a * 1LL * b) % MOD; }
void rmult(int &a, int b) { a = mult(a, b); }
int modpow(int a, int b) {
  int r = 1;
  while (b) {
    if (b & 1)
      r = mult(r, a);
    a = mult(a, a);
    b >>= 1;
  }
  return r;
}
int choose(int a, int b) {
  if (a < 0 || b < 0)
    return 0;
  if (a < b)
    return 0;
  if (b == 0)
    return 1;
  if (a == b)
    return 1;
  return mult(fact[a], mult(ifact[b], ifact[a - b]));
}
int inverse(int a) { return modpow(a, MOD - 2); }
void init(int _n) {
  fact.clear();
  ifact.clear();
  inv.clear();
  pow2.clear();
  fact.resize(_n + 1);
  ifact.resize(_n + 1);
  inv.resize(_n + 1);
  pow2.resize(_n + 1);
  pow2[0] = 1;
  ifact[0] = 1;
  fact[0] = 1;
  for (int i = 1; i <= _n; i++) {
    pow2[i] = add(pow2[i - 1], pow2[i - 1]);
    fact[i] = mult(fact[i - 1], i);
    // ifact[i]=mult(ifact[i-1],inv[i]);
  }
  ifact[_n] = inverse(fact[_n]);
  for (int i = _n - 1; i >= 1; i--) {
    ifact[i] = mult(ifact[i + 1], i + 1);
  }
  for (int i = 1; i <= _n; i++) {
    inv[i] = mult(fact[i - 1], ifact[i]);
  }
}

const int N = 2e5 + 7;
int n, k;
int m;
vector<int> a;
int dp[N];

int dfs(int idx) {
  if (idx == n - 1)
    return 1;
  int &ans = dp[idx];
  if (ans + 1)
    return ans;
  ans = 0;
  for (auto it : a) {
    if (idx + it < n) {
      radd(ans, dfs(idx + it));
    }
  }
  return ans;
}

void solve() {
  cin >> n >> k;
  forn(i, k) {
    int x, y;
    cin >> x >> y;
    rep(j, x, y + 1) a.push_back(j);
  }
  sort(all(a));
  a.erase(unique(all(a)), a.end());
  ms(dp, -1);
  cout << dfs(0);
}

int32_t main() {
  FAST_IO;
  int t = 1;
  //    cin >> t ;
  while (t--) {
    solve();
  }
}