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++ (Clang 10.0.0 with AC Library v1.1) (judge verdict: Time Limit Exceeded)

#include <ios>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <atcoder/all>
#define rep(i, n) for(int i = 0; i < (int)(n); i++)
#define repR(i, n) for(int i = (n) - 1; i > -1; i--)
#define rep1(i, n) for(int i = 1; i < (int)(n + 1); i++)
#define rep1R(i, n) for(int i = (n); i > 0; i--)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
using namespace atcoder;

using mint = modint998244353;

struct S {
  mint v;
  ll len;
};

S op(S a, S b) {
  return {a.v * mint(10).pow(b.len) + b.v, a.len + b.len};
}

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

using F = int;

S mapping(F f, S x) {
  if (f != 0) {
    return {(mint(10).pow(x.len) - 1) / 9 * f, x.len};
  } else {
    return x;
  }
}

F composition(F f, F g) {
  if (f == 0) {
    return g;
  } else {
    return f;
  }
}

F id() {
  return 0;
}

int main() {
  ios_base::sync_with_stdio(false);
  int N, Q;
  cin >> N >> Q;
  vector<S> v(N);
  rep(i, N) {
    v[i] = S {1, 1};
  }
  lazy_segtree<S, op, e, F, mapping, composition, id> seg(v);
  rep(i, Q) {
    int L, R, D;
    cin >> L >> R >> D;
    L -= 1;
    seg.apply(L, R, D);
    cout << seg.all_prod().v.val() << endl;
  }
  return 0;
}