Problem p02550 (C++) — buggy submission, verdict: Runtime Error

// Original Code:
// #include <self/utility>
// #include <self/debug>
// using namespace std;
// ll n;
// ll x,m;
// ll a[100005];
// ll s[100005];
// ll s2[100005];
// map <ll,ll> mpos;
//
// int main()
//{
////	freopen("input.txt","r",stdin);
//	cin>>n>>x>>m;
//	a[0]=x;
//	ll k=-1;
//	ll sum=0;
//	s[0]=a[0];
//	mpos[a[0]]=0;
//	ll st=-1;
//	for(int i=1;i<=m;i++)
//	{
//		a[i]=a[i-1]*a[i-1]%m;
//		s[i]=s[i-1]+a[i];
//		if(mpos.find(a[i])!=mpos.end())
//		{
//			st=mpos[a[i]];
//			k=i-mpos[a[i]];
//			break;
//		}
//		mpos[a[i]]=i;
//	}
//	assert(k!=-1);
//	assert(st!=-1);
//	s2[0]=a[st];
//	sum=a[st];
//	for(int i=1;i<k;i++)
//	{
//		s2[i]=s2[i-1]+a[st+i];
//		sum+=a[st+i];
//	}
//	ll res=0;
//	for(int i=0;i<min(n,st);i++)
//	{
//		res+=a[i];
//	}
//	n-=min(n,st);
//	res+=(n/k)*sum;
//	res+=((n%k)-1<0?0:s2[(n%k)-1]);
//	cout<<res<<endl;
//	return 0;
//}

// substituted with C++ Inliner
#ifndef _SELF_UTILITY
#define _SELF_UTILITY 1
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#define Endl endl
#define mp make_pair
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define over(A)                                                                \\
  {                                                                            \\
    cout << A << endl;                                                         \\
    exit(0);                                                                   \\
  }
#define all(A) A.begin(), A.end()
#define quickcin ios_base::sync_with_stdio(false);
const int mod = 998244353;
const int gmod = 2;
const int inf = 1039074182;
const ll llinf = 1LL * inf * inf;
template <typename T1, typename T2> inline void chmin(T1 &x, T2 b) {
  if (b < x)
    x = b;
}
template <typename T1, typename T2> inline void chmax(T1 &x, T2 b) {
  if (b > x)
    x = b;
}
template <typename T1, typename T2> inline void chadd(T1 &x, T2 b) {
  x += b;
  if (x >= mod)
    x -= mod;
}
template <typename T1, typename T2> inline void chmul(T1 &x, T2 b) {
  x = 1LL * x * b % mod;
}
template <typename T1, typename T2> inline void chmod(T1 &x, T2 b) {
  x %= b, x += b;
  if (x >= b)
    x -= b;
}
#endif

#ifndef _SELF_DEBUG
#define _SELF_DEBUG 1
#ifndef _SELF_OPERATOR
#define _SELF_OPERATOR 1
using namespace std;
template <typename T> ostream &operator<<(ostream &cout, vector<T> vec) {
  cout << "{";
  for (int i = 0; i < (int)vec.size(); i++) {
    cout << vec[i];
    if (i != (int)vec.size() - 1)
      cout << ',';
  }
  cout << "}";
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, pair<T1, T2> p) {
  cout << "(" << p.first << ',' << p.second << ")";
  return cout;
}

template <typename T, typename T2>
ostream &operator<<(ostream &cout, set<T, T2> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, multiset<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, queue<T> q) {
  vector<T> t;
  while (q.size()) {
    t.push_back(q.front());
    q.pop();
  }
  cout << t;
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, map<T1, T2> m) {
  for (auto &x : m) {
    cout << "Key: " << x.first << ' ' << "Value: " << x.second << endl;
  }
  return cout;
}

template <typename T> T operator*(vector<T> v1, vector<T> v2) {
  assert(v1.size() == v2.size());
  int n = v1.size();
  T res = 0;
  for (int i = 0; i < n; i++) {
    res += v1[i] * v2[i];
  }
  return res;
}

template <typename T1, typename T2>
pair<T1, T2> operator+(pair<T1, T2> x, pair<T1, T2> y) {
  return make_pair(x.first + y.first, x.second + y.second);
}

template <typename T1, typename T2>
void operator+=(pair<T1, T2> &x, pair<T1, T2> y) {
  x.first += y.first;
  x.second += y.second;
}

template <typename T1, typename T2> pair<T1, T2> operator-(pair<T1, T2> x) {
  return make_pair(-x.first, -x.second);
}

template <typename T> vector<vector<T>> operator~(vector<vector<T>> vec) {
  vector<vector<T>> v;
  int n = vec.size(), m = vec[0].size();
  v.resize(m);
  for (int i = 0; i < m; i++) {
    v[i].resize(n);
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      v[i][j] = vec[j][i];
    }
  }
  return v;
}
#endif

void print0x(int x) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  std::reverse(vec.begin(), vec.end());
  for (int i = 0; i < (int)vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}

template <typename T> void print0x(T x, int len) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  reverse(vec.begin(), vec.end());
  for (int i = vec.size(); i < len; i++) {
    putchar('0');
  }
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}
#endif
using namespace std;
ll n;
ll x, m;
ll a[100005];
ll s[100005];
ll s2[100005];
map<ll, ll> mpos;

int main() {
  //	freopen("input.txt","r",stdin);
  cin >> n >> x >> m;
  a[0] = x;
  ll k = -1;
  ll sum = 0;
  s[0] = a[0];
  mpos[a[0]] = 0;
  ll st = -1;
  for (int i = 1; i <= m; i++) {
    a[i] = a[i - 1] * a[i - 1] % m;
    s[i] = s[i - 1] + a[i];
    if (mpos.find(a[i]) != mpos.end()) {
      st = mpos[a[i]];
      k = i - mpos[a[i]];
      break;
    }
    mpos[a[i]] = i;
  }
  assert(k != -1);
  assert(st != -1);
  s2[0] = a[st];
  sum = a[st];
  for (int i = 1; i < k; i++) {
    s2[i] = s2[i - 1] + a[st + i];
    sum += a[st + i];
  }
  ll res = 0;
  for (int i = 0; i < min(n, st); i++) {
    res += a[i];
  }
  n -= min(n, st);
  res += (n / k) * sum;
  res += ((n % k) - 1 < 0 ? 0 : s2[(n % k) - 1]);
  cout << res << endl;
  return 0;
}


Error: WA

Fixed submission:

// Original Code:
// #include <self/utility>
// #include <self/debug>
// using namespace std;
// int n;
// int dp[200005];
// int sum[200005];
// int k;
// int l[15];
// int r[15];
//
// int tmp;
// inline int& getSum(int l,int r)
//{
//	chmax(l,1);
//	chmax(r,0);
//	tmp=sum[r]-sum[l-1];
//	chmod(tmp,mod);
//	return tmp;
// }
//
// inline int& getDpSum(int pos,int id)
//{
//	int l=::l[id];
//	int r=::r[id];
//	return getSum(pos-r,pos-l);
// }
//
// int main()
//{
////	freopen("input.txt","r",stdin);
//	cin>>n>>k;
//	for(int i=0;i<k;i++)
//	{
//		cin>>l[i]>>r[i];
//	}
//	dp[1]=1;
//	sum[1]=1;
//	for(int i=2;i<=n;i++)
//	{
//		for(int j=0;j<k;j++)
//		{
//			chadd(dp[i],getDpSum(i,j));
//		}
//		sum[i]=sum[i-1];
//		chadd(sum[i],dp[i]);
//	}
//	cout<<dp[n]<<endl;
//	return 0;
//}

// substituted with C++ Inliner
#ifndef _SELF_UTILITY
#define _SELF_UTILITY 1
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#define Endl endl
#define mp make_pair
#define ll long long
#define ull unsigned long long
#define pii pair<int, int>
#define over(A)                                                                \\
  {                                                                            \\
    cout << A << endl;                                                         \\
    exit(0);                                                                   \\
  }
#define all(A) A.begin(), A.end()
#define quickcin ios_base::sync_with_stdio(false);
const int mod = 998244353;
const int gmod = 2;
const int inf = 1039074182;
const ll llinf = 1LL * inf * inf;
template <typename T1, typename T2> inline void chmin(T1 &x, T2 b) {
  if (b < x)
    x = b;
}
template <typename T1, typename T2> inline void chmax(T1 &x, T2 b) {
  if (b > x)
    x = b;
}
template <typename T1, typename T2> inline void chadd(T1 &x, T2 b) {
  x += b;
  if (x >= mod)
    x -= mod;
}
template <typename T1, typename T2> inline void chmul(T1 &x, T2 b) {
  x = 1LL * x * b % mod;
}
template <typename T1, typename T2> inline void chmod(T1 &x, T2 b) {
  x %= b, x += b;
  if (x >= b)
    x -= b;
}
#endif

#ifndef _SELF_DEBUG
#define _SELF_DEBUG 1
#ifndef _SELF_OPERATOR
#define _SELF_OPERATOR 1
using namespace std;
template <typename T> ostream &operator<<(ostream &cout, vector<T> vec) {
  cout << "{";
  for (int i = 0; i < (int)vec.size(); i++) {
    cout << vec[i];
    if (i != (int)vec.size() - 1)
      cout << ',';
  }
  cout << "}";
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, pair<T1, T2> p) {
  cout << "(" << p.first << ',' << p.second << ")";
  return cout;
}

template <typename T, typename T2>
ostream &operator<<(ostream &cout, set<T, T2> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, multiset<T> s) {
  vector<T> t;
  for (auto x : s)
    t.push_back(x);
  cout << t;
  return cout;
}

template <typename T> ostream &operator<<(ostream &cout, queue<T> q) {
  vector<T> t;
  while (q.size()) {
    t.push_back(q.front());
    q.pop();
  }
  cout << t;
  return cout;
}

template <typename T1, typename T2>
ostream &operator<<(ostream &cout, map<T1, T2> m) {
  for (auto &x : m) {
    cout << "Key: " << x.first << ' ' << "Value: " << x.second << endl;
  }
  return cout;
}

template <typename T> T operator*(vector<T> v1, vector<T> v2) {
  assert(v1.size() == v2.size());
  int n = v1.size();
  T res = 0;
  for (int i = 0; i < n; i++) {
    res += v1[i] * v2[i];
  }
  return res;
}

template <typename T1, typename T2>
pair<T1, T2> operator+(pair<T1, T2> x, pair<T1, T2> y) {
  return make_pair(x.first + y.first, x.second + y.second);
}

template <typename T1, typename T2>
void operator+=(pair<T1, T2> &x, pair<T1, T2> y) {
  x.first += y.first;
  x.second += y.second;
}

template <typename T1, typename T2> pair<T1, T2> operator-(pair<T1, T2> x) {
  return make_pair(-x.first, -x.second);
}

template <typename T> vector<vector<T>> operator~(vector<vector<T>> vec) {
  vector<vector<T>> v;
  int n = vec.size(), m = vec[0].size();
  v.resize(m);
  for (int i = 0; i < m; i++) {
    v[i].resize(n);
  }
  for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
      v[i][j] = vec[j][i];
    }
  }
  return v;
}
#endif

void print0x(int x) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  std::reverse(vec.begin(), vec.end());
  for (int i = 0; i < (int)vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}

template <typename T> void print0x(T x, int len) {
  std::vector<int> vec;
  while (x) {
    vec.push_back(x & 1);
    x >>= 1;
  }
  reverse(vec.begin(), vec.end());
  for (int i = vec.size(); i < len; i++) {
    putchar('0');
  }
  for (int i = 0; i < vec.size(); i++) {
    std::cout << vec[i];
  }
  std::cout << ' ';
}
#endif
using namespace std;
int n;
int dp[200005];
int sum[200005];
int k;
int l[15];
int r[15];

int tmp;
inline int &getSum(int l, int r) {
  chmax(l, 1);
  chmax(r, 0);
  tmp = sum[r] - sum[l - 1];
  chmod(tmp, mod);
  return tmp;
}

inline int &getDpSum(int pos, int id) {
  int l = ::l[id];
  int r = ::r[id];
  return getSum(pos - r, pos - l);
}

int main() {
  //	freopen("input.txt","r",stdin);
  cin >> n >> k;
  for (int i = 0; i < k; i++) {
    cin >> l[i] >> r[i];
  }
  dp[1] = 1;
  sum[1] = 1;
  for (int i = 2; i <= n; i++) {
    for (int j = 0; j < k; j++) {
      chadd(dp[i], getDpSum(i, j));
    }
    sum[i] = sum[i - 1];
    chadd(sum[i], dp[i]);
  }
  cout << dp[n] << endl;
  return 0;
}