瞎写的过了
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5,mod=998244353;
int w1[N<<2],w2[N<<2],w3[N<<2],lzy[N<<2],a[N],n,m;
void pushup(int u){
w1[u]=min(w1[u<<1],w1[u<<1|1]);
w2[u]=max(w2[u<<1],w2[u<<1|1]);
w3[u]=max(w3[u<<1],w3[u<<1|1]);
}
void build(int u,int l,int r){
if(l==r) w3[u]=a[l];
else{
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
}
void mkt(int u,int x){
w1[u]+=x,w2[u]+=x,lzy[u]+=x;
}
void psd(int u){
if(!lzy[u]) return;
mkt(u<<1,lzy[u]);
mkt(u<<1|1,lzy[u]);
lzy[u]=0;
}
void upd(int u,int l1,int r1,int l2,int r2){
if(l2<=l1&&r1<=r2){
if(w1[u]){
mkt(u,-1);
return;
}
else{
if(!w2[u]){
if(w3[u]<=1) return;
else{
if(l1==r1){
w3[u]=sqrt(w3[u]);
return;
}
}
}
}
}
psd(u);
int mid=l1+r1>>1;
if(l2<=mid) upd(u<<1,l1,mid,l2,r2);
if(r2>mid) upd(u<<1|1,mid+1,r1,l2,r2);
pushup(u);
}
void upd1(int u,int l1,int r1,int l2,int r2){
if(l2<=l1&&r1<=r2) mkt(u,1);
else{
psd(u);
int mid=l1+r1>>1;
if(l2<=mid) upd1(u<<1,l1,mid,l2,r2);
if(r2>mid) upd1(u<<1|1,mid+1,r1,l2,r2);
pushup(u);
}
}
int qry1(int u,int l,int r,int q){
if(l==r) return w3[u];
else{
psd(u);
int mid=l+r>>1;
if(q<=mid) return qry1(u<<1,l,mid,q);
else return qry1(u<<1|1,mid+1,r,q);
}
}
int qry2(int u,int l,int r,int q){
if(l==r) return w1[u];
else{
psd(u);
int mid=l+r>>1;
if(q<=mid) return qry2(u<<1,l,mid,q);
else return qry2(u<<1|1,mid+1,r,q);
}
}
int ksm(int a,int b,int p){
int res=1;
while(b){
if(b&1) res*=a,res%=p;
a*=a,a%=p;
b>>=1;
}
return res;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
for(int i=1,op,l,r;i<=m;i++){
scanf("%lld%lld%lld",&op,&l,&r);
if(op&1) upd(1,1,n,l,r);
else upd1(1,1,n,l,r);
}
int ans=0;
for(int i=1;i<=n;i++) ans+=ksm(qry1(1,1,n,i),ksm(2,qry2(1,1,n,i),mod-1),mod),ans%=mod;
printf("%lld\n",ans);
return 0;
}