#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[200005],block,t,pos[200005],st[2005],ed[2005],mx[2005],add[2005],mod=998244353,k,single[200005];
void build(){
block=(int)sqrt(n);
t=n/block;
if(n%block){
t++;
}
for(int i=1;i<=t;i++){
st[i]=(i-1)*block+1;
ed[i]=i*block;
}
ed[t]=n;
for(int i=1;i<=n;i++){
pos[i]=(i-1)/block+1;
}
}
void update1(int l,int r){
int x=pos[l];
int y=pos[r];
if(x==y){
if(add[x]>=1){
add[x]--;
return;
}
for(int i=l;i<=r;i++){
if(single[i]>=1){
single[i]--;
continue;
}
a[i]=(int)sqrt(a[i]);
}
return;
}
else{
for(int i=l;i<=ed[x];i++){
if(single[i]>=1){
single[i]--;
continue;
}
a[i]=(int)sqrt(a[i]);
}
for(int i=st[y];i<=r;i++){
if(single[i]>=1){
single[i]--;
continue;
}
a[i]=(int)sqrt(a[i]);
}
for(int i=x+1;i<=y-1;i++){
if(add[i]>=1){
add[i]--;
continue;
}
for(int j=st[i];j<=ed[i];j++){
if(single[j]>=1){
single[j]--;
continue;
}
a[j]=(int)sqrt(a[j]);
}
}
return;
}
}
void update2(int l,int r){
int x=pos[l];
int y=pos[r];
if(x==y){
for(int i=l;i<=r;i++){
single[i]++;
}
return;
}
else{
for(int i=l;i<=ed[x];i++){
single[i]++;
}
for(int i=st[y];i<=r;i++){
single[i]++;
}
for(int i=x+1;i<=y-1;i++){
add[i]++;
}
return;
}
}
int qpow(int x,int y){
int ans=1,p=x;
while(y>0){
if(y&1){
ans=ans%mod*p%mod;
ans%=mod;
}
y>>=1;
p*=p%mod;
p%=mod;
}
return ans;
}
int phi(int x,int y){
int ans=1;
int p=x;
while(y>0){
if(y&1){
ans=ans%k*p%k;
ans%=k;
}
p=p%k*p%k;
p%=k;
y>>=1;
}
return ans%k+k;
}
signed main()
{
k=mod-1;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
build();
for(int i=1;i<=m;++i){
int op,l,r;
scanf("%lld%lld%lld",&op,&l,&r);
if(op==1){
update1(l,r);
}
else{
update2(l,r);
}
}
int sum=0;
for(int i=1;i<=n;++i){
if(add[pos[i]]+single[i]<=29){
int g=qpow(2,add[pos[i]]+single[i]);
sum=sum+qpow(a[i],g)%mod;
sum%=mod;
}
else{
int x=phi(2,add[pos[i]]+single[i]);
sum=sum+qpow(a[i],x)%mod;
sum%=mod;
}
}
cout<<sum;
return 0;
}