#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
#define int long long
const int N = 3e5 + 5, MOD = 998244353;
int a[N], n, m, l, r;
struct Node
{
int l, r, maxn, cnt;
};
Node tree[N << 2];
inline int quickpow(register int x, register int y)
{
long long ans = 1, base = x;
while (y)
{
if (y & 1)
{
ans *= base;
ans %= MOD;
}
base *= base;
base %= MOD;
y >>= 1;
}
return ans;
}
inline void push_up(register int u)
{
tree[u].maxn = max(tree[u << 1].maxn, tree[u << 1 | 1].maxn);
tree[u].maxn %= MOD;
}
inline void push_down(int u)
{
Node &root = tree[u], &left = tree[u << 1], &right = tree[u << 1 | 1];
if (root.cnt)
{
left.cnt += root.cnt;
left.maxn = quickpow(left.maxn, (root.cnt + 1));
right.cnt += root.cnt;
right.maxn = quickpow(right.maxn, (root.cnt + 1));
root.cnt = 0;
}
}
inline void build(register int u, register int l, register int r)
{
tree[u].l = l, tree[u].r = r;
if (l == r)
{
tree[u].maxn = a[r];
tree[u].cnt = 0;
}
else
{
register int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
push_up(u);
}
}
inline void modify1(register int u) // 开方
{
if (tree[u].maxn <= 1) return;
if (tree[u].l >= l && tree[u].r <= r && tree[u].l == tree[u].r)
{
tree[u].maxn = sqrt(tree[u].maxn * 1.0);
return;
}
push_down(u);
int mid = tree[u].l + tree[u].r >> 1;
if (l <= mid) modify1(u << 1);
if (r > mid) modify1(u << 1 | 1);
push_up(u);
}
inline void modify2(register int u)
{
if (tree[u].l >= l && tree[u].r <= r)
{
tree[u].cnt++;
tree[u].maxn = quickpow(tree[u].maxn, 2);
}
else
{
push_down(u);
int mid = tree[u].l + tree[u].r >> 1;
if (l <= mid) modify2(u << 1);
if (r > mid) modify2(u << 1 | 1);
push_up(u);
}
}
inline int query(register int u)
{
if (tree[u].l == tree[u].r && tree[u].l >= l && tree[u].r <= r) return tree[u].maxn;
push_down(u);
int mid = tree[u].l + tree[u].r >> 1, s = 0;
if (l <= mid) s = query(u << 1);
s %= MOD;
if (r > mid) s += query(u << 1 | 1);
s %= MOD;
return s;
}
signed main()
{
scanf("%lld %lld", &n, &m);
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
build(1, 1, n);
while (m--)
{
int opt;
scanf("%lld %lld %lld", &opt, &l, &r);
if (opt == 1) modify1(1);
else modify2(1);
}
l = 1, r = n;
printf("%lld\n", query(1));
return 0;
}
只有 10 分,好多都是WA。