Problem:
Score : 500 points

Problem Statement

You have a string S of length N.
Initially, all characters in S are 1s.

You will perform queries Q times.
In the i-th query, you are given two integers L_i, R_i and a character D_i (which is a digit).
Then, you must replace all characters from the L_i-th to the R_i-th (inclusive) with D_i.

After each query, read the string S as a decimal integer, and print its value modulo 998,244,353.

Constraints

1 \leq N, Q \leq 200,000

1 \leq L_i \leq R_i \leq N

1 \leq D_i \leq 9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N Q
L_1 R_1 D_1
:
L_Q R_Q D_Q

Output

Print Q lines.
In the i-th line print the value of S after the i-th query, modulo 998,244,353.

Sample Input 1

8 5
3 6 2
1 4 7
3 8 3
2 2 2
4 5 1

Sample Output 1

11222211
77772211
77333333
72333333
72311333

Sample Input 2

200000 1
123 456 7

Sample Output 2

641437905

Don't forget to take the modulo.

Solution in C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
using namespace std;

const int mod=998244353;
const int MAXN=200010;
using ll = long long;
ll po10[MAXN],popsum[MAXN];

using PII = pair<int,int>;
using PIII = pair<PII,int>;
set<PIII> st;

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    po10[0] = 0;
    po10[1] = 1;
    for (int i=2;i<=n;i++) {
        po10[i] = po10[i-1]*10%mod;
    }
    popsum[0] = 0;
    for (int i=1;i<=n;i++) {
        popsum[i]=(popsum[i-1]+po10[i])%mod;
    }
    ll ans=popsum[n];
    st.insert({{1,n},1});
    for (int i=1;i<=m;i++) {
        int l,r,x;
        scanf("%d%d%d",&l,&r,&x);
        int tmp=l;
        l = n+1-r;
        r = n+1-tmp;
        PIII p{{l,r},x};
        auto it = st.upper_bound(p);
        --it;
        int xb = it->second;
        int lb = it->first.first;
        int rb = it->first.second;
        while (lb <= r) {
            // printf("%d %d %d\n",lb,rb,xb);
            int low = max(l,lb);
            int high = min(r,rb);
                ans+=(popsum[high]-popsum[low-1]+mod)*(x-xb+mod)%mod;
                ans%=mod;
            it = st.erase(it);
            if (lb<=l-1) st.insert({{lb,l-1},xb});
            if (r+1<=rb) st.insert({{r+1,rb},xb});
            if (it==st.end()) break;
            xb = it->second;
            lb = it->first.first;
            rb = it->first.second;
        }
        st.insert(p);
        printf("%lld\n",ans);
    }
    return 0;
}