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 with AC Library v1.1) (judge verdict: Runtime Error)

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

using mint= atcoder::modint998244353;
constexpr int Nmax= 200'000; // '
constexpr int logNmax= 31- __builtin_clz(Nmax);

struct S{
  mint mS_rep;
  int  mS_digit;
};

struct F{
  mint mF_assign;
  bool mF_id;
};

vector<mint> g_aux(logNmax);
void init(){
  g_aux.at(0)= 1;
  for(int i= 1; i<logNmax; i++){
    g_aux.at(i)= g_aux.at(i-1)*mint(10).pow(1<<(i-1)) + g_aux.at(i-1);
  }
}

S op(S left, S right){ return S{left.mS_rep*mint(10).pow(right.mS_digit) + right.mS_rep, left.mS_digit+ right.mS_digit}; };

S e(){ return S{0, 0}; };

S mapping(F f, S s){
  if(f.mF_id){ return s; }
  else{
    int logdig= 31- __builtin_clz(s.mS_digit);
    return S{f.mF_assign* g_aux.at(logdig), s.mS_digit};
  }
};

F composition(F f2, F f1){
  if(f2.mF_id){ return f1; }
  else        { return f2; }
};

F id(){ return F{0, true}; };

int main(){
  init();

  int N,Q;
  cin >> N >> Q;

  atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(vector<S>(N, S{1,1}));

  int bufL,bufR,bufD;
  for(int q=0; q<Q; q++){
    cin >> bufL >> bufR >> bufD;
    bufL--; // [bufL,bufR] 1-indexed -> [bufL,bufR) 0-indexed
    seg.apply(bufL, bufR, F{bufD, false});

    cout << seg.all_prod().mS_rep.val() << endl;
  }
}