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 Java (OpenJDK 1.8.0) (judge verdict: Time Limit Exceeded)

import java.util.*;
import java.io.*;
import java.nio.charset.StandardCharsets;

public class Main {

	public static void main(String[] args) throws IOException {
		InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8);
		BufferedReader in = new BufferedReader(reader);
		Main ins = new Main(in);
		ins.calc();
		ins.showResult();
	}

	int N, Q;
	long[] mods;
	long mod = 0L;
	long MOD = 998244353L;
	int[] L, R, D;
	int[] lasts;

	Main(BufferedReader in) throws IOException {
		String[] tokens = in.readLine().split(" ");
		N = Integer.parseInt(tokens[0]);
		Q = Integer.parseInt(tokens[1]);

		L = new int[Q + 1];
		R = new int[Q + 1];
		D = new int[Q + 1];
		L[0] = 0;
		R[0] = N - 1;
		D[0] = 1;
		for (int i = 0; i < Q; ++i) {
			tokens = in.readLine().split(" ");
			L[i + 1] = Integer.parseInt(tokens[0]) - 1;
			R[i + 1] = Integer.parseInt(tokens[1]) - 1;
			D[i + 1] = Integer.parseInt(tokens[2]);
		}

		mods = new long[N];
		mods[N - 1] = 1L;
		for (int i = N - 2; i >= 0; --i) {
			mods[i] = mods[i + 1] * 10L % MOD;
		}

		for (int i = 0; i < N; ++i) {
			mod += mods[i];
			mod %= MOD;
		}

		lasts = new int[N];
		Arrays.fill(lasts, 1);
	}

	void update(int l, int r, int d) {
		// update操作
		for (int i = l; i <= r; ++i) {
			mod += mods[i] * (long) (d - lasts[i]) + MOD;
			mod %= MOD;
			lasts[i] = d;
		}
	}

	void calc() {
		// 初手だけ
		for (int i = 1; i <= Q; ++i) {
			update(L[i], R[i], D[i]);
			System.out.println(mod);
		}
	}

	void showResult() {
	}
}