#include<bits/stdc++.h> #include<atcoder/all> using namespace std; using namespace atcoder; typedef long long ll; using mint=modint998244353; ll M=3001; vector<mint> op(vector<mint> a,vector<mint> b){ vector<mint> c=convolution(a,b); vector<mint> r(min(M,(ll)(c.size())),0); for(ll i=0;i<(ll)(r.size());i++){ r[i]=c[i]; } return r; } vector<mint> e(){ vector<mint> r(1,1); return r; } int main(){ ll N,Q; cin>>N>>Q; vector<ll> K(Q); vector<vector<ll>> que(Q,vector<ll>(4)); for(ll i=0;i<Q;i++){ cin>>K[i]; K[i]--; for(ll j=0;j<4;j++){ cin>>que[i][j]; } } vector<ll> X=K; sort(X.begin(),X.end()); vector<ll> y(1,X[0]); ll L=X.size(); for(ll i=1;i<L;i++){ if(X[i]!=X[i-1]){ y.push_back(X[i]); } } X=y; L=X.size(); unordered_map<ll,ll> Y; for(ll i=0;i<L;i++){ Y[X[i]]=i; } vector<vector<mint>> Z(L,vector<mint>(M,1)); vector<vector<mint>> x(L,vector<mint>(M,1)); segtree<vector<mint>,op,e> seg(x); vector<mint> p(M,1); vector<mint> q(1,1); ll R=N-L; while(R){ if(R&1){ q=op(p,q); } p=op(p,p); R>>=1; } ll I; for(ll i=0;i<Q;i++){ I=Y[K[i]]; for(ll j=que[i][0];j<=que[i][1];j++){ Z[I][j]=0; } seg.set(I,Z[I]); vector<mint> A=op(seg.all_prod(),q); mint ANS=0; for(ll j=que[i][2];j<=que[i][3];j++){ if((ll)(A.size())>j){ ANS+=A[j]; } } cout<<ANS.val()<<"\n"; } }