#include <bits/stdc++.h>
using namespace std;
#define fst ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
const int N = 2e5 + 10, P = 998244353;
int n, m, a[N];
struct Node
{
int x, sz, add, mul;
void solve(int u, int v)
{
add = (add * u % P + v) % P;
mul = mul * u % P;
x = (x * u % P + sz * v % P) % P;
}
} tr[N << 2];
#define lson (rt << 1)
#define rson (rt << 1 | 1)
#define mid (l + r) / 2
void push_up(int rt) { tr[rt].x = tr[lson].x + tr[rson].x; }
void build(int rt, int l, int r)
{
tr[rt] = {0, r - l + 1, 0, 1};
if (l == r) return tr[rt] = {a[l] % P, 1, 0, 1}, void();
build(lson, l, mid);
build(rson, mid + 1, r);
push_up(rt);
}
void push_down(int rt)
{
int &u = tr[rt].mul, &v = tr[rt].add;
tr[lson].solve(u, v);
tr[rson].solve(u, v);
u = 1, v = 0;
}
void update(int rt, int l, int r, int sp, int ep, int u, int v)
{
if (sp <= l && r <= ep) return tr[rt].solve(u, v), void();
push_down(rt);
if (sp <= mid) update(lson, l, mid, sp, ep, u, v);
if (ep > mid) update(rson, mid + 1, r, sp, ep, u, v);
push_up(rt);
}
int qry(int rt, int l, int r, int p)
{
if (l == r) return tr[rt].x;
push_down(rt);
if (p <= mid) return qry(lson, l, mid, p);
return qry(rson, mid + 1, r, p);
}
int fpm(int a, int n)
{
int res = 1;
while (n)
{
if (n & 1) res = res * a % P;
a = a * a % P;
n /= 2;
}
return res;
}
int main()
{
fst
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
while (m--)
{
int l, r, x;
cin >> l >> r >> x;
int inv = fpm(r - l + 1, P - 2);
update(1, 1, n, l, r, (r - l) * inv % P, x * inv % P);
}
for (int i = 1; i <= n; i++) cout << qry(1, 1, n, i) << " ";
return 0;
}