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: Accepted)

#include<stdio.h>
#define mod 998244353
long long sum[10][3000000];
long long base[3000000];
long long tree[3000000];
long long left[3000000];
long long right[3000000];
long long lazy[3000000];
int l,r,value;
void build(int l,int r,int k){
	left[k]=l;right[k]=r;
	if (l==r){
		tree[k]=1;
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,k*2);
	build(mid+1,r,k*2+1);
	tree[k]=((tree[k*2]*base[r-mid]% mod)+tree[k*2+1])% mod;
}
void laze(int k){
	if (lazy[k]==0) return;
    lazy[k*2]=lazy[k]; lazy[k*2+1]=lazy[k];
    tree[k]=sum[lazy[k]][right[k]-left[k]+1];
    lazy[k]=0; 
}

void update(int l,int r,int k,int value){
	laze(k);
	if (r<left[k]||l>right[k]) return;
	if (left[k]>=l&&right[k]<=r) {
		lazy[k]=value;
		laze(k);
		return;
	}   
	    int mid=(left[k]+right[k])/2;
		update(l,r,k*2,value);
		update(l,r,k*2+1,value);
		tree[k]=((tree[k*2]*base[right[k]-mid]% mod)+tree[k*2+1])% mod;
}
int main(){
	int n,q;scanf("%d %d",&n,&q);
	for (int i=1;i<=9;i++){
		sum[i][1]=i;
		for (int j=2;j<=n;j++){
			sum[i][j]=((sum[i][j-1]*10% mod)+i)% mod;
		}
	}
	base[0]=1;
	for (int i=1;i<=n;i++){
		base[i]=(base[i-1]*10)% mod;
	}
	build(1,n,1);
	for (int i=1;i<=q;i++){
		scanf("%d %d %d",&l,&r,&value);
		update(l,r,1,value);
		printf("%lld\n",tree[1]);
	}
}