#include<stdio.h>
#include<math.h>
#define N 200009
#define int long long
#define mod 998244353
int a[N], whe[N];
int sum[N];
int st[N], en[N];
inline void updata1(int l, int r)
{
int L = whe[l], R = whe[r];
if (L == R)
for (register int i = l;i <= r;++ i)
sum[whe[i]] -= a[i], a[i] = sqrt(a[i]), sum[whe[i]] += a[i], sum[whe[i]] %= mod;
else
{
for (register int i = l;i <= en[L];++ i)
sum[whe[i]] -= a[i], a[i] = sqrt(a[i]), sum[whe[i]] += a[i], sum[whe[i]] %= mod;
for (register int i = st[R];i <= r;++ i)
sum[whe[i]] -= a[i], a[i] = sqrt(a[i]), sum[whe[i]] += a[i], sum[whe[i]] %= mod;
for (register int i = L + 1;i < R;++ i)
{
if (sum[i] == en[i] - st[i] + 1)
continue;
sum[i] = 0;
for (register int j = st[i];j <= en[j];++ j)
a[j] = sqrt(a[j]), sum[i] += a[j], sum[i] %= mod;
}
}
}
inline void updata2(int l, int r)
{
int L = whe[l], R = whe[r];
if (L == R)
for (register int i = l;i <= r;++ i)
sum[whe[i]] -= a[i], a[i] = (int)pow(a[i], 2) % mod, sum[whe[i]] += a[i], sum[whe[i]] %= mod;
else
{
for (register int i = l;i <= en[L];++ i)
sum[whe[i]] -= a[i], a[i] = (int)pow(a[i], 2) % mod, sum[whe[i]] += a[i], sum[whe[i]] %= mod;
for (register int i = st[R];i <= r;++ i)
sum[whe[i]] -= a[i], a[i] = (int)pow(a[i], 2) % mod, sum[whe[i]] += a[i], sum[whe[i]] %= mod;
for (register int i = L + 1;i < R;++ i)
{
if (sum[i] == en[i] - st[i] + 1)
continue;
sum[i] = 0;
for (register int j = st[i];j <= en[j];++ j)
a[j] = (int)pow(a[j], 2) % mod, sum[i] += a[j], sum[i] %= mod;
}
}
}
inline int query(int l, int r)
{
int L = whe[l], R = whe[r], ret = 0;
if (L == R)
for (int i = l;i <= r;++ i)
ret += a[i], ret %= mod;
else
{
for (int i = l;i <= en[L];++ i)
ret += a[i], ret %= mod;
for (int i = st[R];i <= r;++ i)
ret += a[i], ret %= mod;
for (int i = L + 1;i < R;++ i)
ret += sum[i], ret %= mod;
}
return ret;
}
signed main()
{
int n, m;
scanf("%lld%lld", &n, &m);
for (register int i = 1;i <= n;++ i)
scanf("%lld", &a[i]);
int block = sqrt(n);
if (n % block)
++ block;
for (register int i = 1;i <= block;++ i)
st[i] = en[i - 1] + 1, en[i] = st[i] + block - 1;
en[block] = n;
for (register int i = 1;i <= block;++ i)
for (register int j = st[i];j <= en[i];++ j)
whe[j] = i, sum[i] += a[j], sum[i] %= mod;
int opt, l, r;
while (m --)
{
scanf("%lld%lld%lld", &opt, &l, &r);
if (opt == 1)
updata1(l, r);
else
updata2(l, r);
}
printf("%lld", query(1, n));
return 0;
}