#include<iostream>
#include<cmath>
#define _int128 int
using namespace std;
const int N=(1e5+5)*4;
const int mod=998244353;
int n,m;
int sum[N],len[N],lazy[N];
int len_2[N],len_sum[N];
int con[N];
int a[N];
int sqr(int x){
return x*x;
}
int gcd(int a,int b){
if(b==0){
return a;
}
if(a==0){
return b;
}
while(b!=0){
int temp=b;
b=a%b;
a=temp;
}
return a;
}
int power(int a,int x) {
int ans=1;
while(x>0){
if(x%2==1){
ans=(ans*a)%mod;
}
a=(a*a)%mod;
x/=2;
}
return ans;
}
void push_up(const int &id){
sum[id]=sum[id<<1]+sum[id<<1|1];
len_sum[id]=len[id]*sum[id]+len_sum[id<<1]+len_sum[id<<1|1];
con[id]=sqr(sum[id])+con[id<<1]+con[id<<1|1];
}
void Lazy(const int &id,const int &l,const int &r,const int &v){
sum[id]+=v*(r-l+1);
lazy[id]+=v;
con[id]+=2*v*len_sum[id]+sqr(v)*len_2[id];
len_sum[id]+=v*len_2[id];
}
void push_down(const int &id,const int &l,const int &r){
if(lazy[id]){
int mid=(l+r)>>1;
Lazy(id<<1,l,mid,lazy[id]);
Lazy(id<<1|1,mid+1,r,lazy[id]);
lazy[id]=0;
}
}
void build(const int &id,const int &l,const int &r){
if(l==r){
sum[id]=len_sum[id]=(int)a[l];
len[id]=len_2[id]=1;
lazy[id]=0;
con[id]=sqr(sum[id]);
return;
}
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
len[id]=len[id<<1]+len[id<<1|1];
len_2[id]=sqr(len[id])+len_2[id<<1]+len_2[id<<1|1];
push_up(id);
}
void update(const int &id,const int &l,const int &r,const int &x,const int &y,const int &v) {
if (x<=l&&y>=r) {
Lazy(id,l,r,v);
return;
}
int mid = (l + r) >> 1;
push_down(id,l,r);
if(x<=mid){
update(id<<1,l,mid,x,y,v);
}
if(y>mid){
update(id<<1|1,mid+1,r,x,y,v);
}
push_up(id);
}
void query(){
int p=con[1],q=sum[1];
int gd=gcd(p,q);
p/=gd,q/=gd;
int ans=((p%mod)*power(q,mod-2))%mod;
cout<<ans<<endl;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int op;
cin>>op;
if(op==2){
query();
}
else{
int l,r,v;
cin>>l>>r>>v;
update(1,1,n,l,r,v);
}
}
return 0;
}