#include using namespace std; using Int = long long; template inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template inline void chmax(T1 &a,T2 b){if(a struct SegmentTree{ using F = function; using G = function; using H = function; Int n,height; F f; G g; H h; T ti; E ei; vector dat; vector laz; SegmentTree(F f,G g,H h,T ti,E ei): f(f),g(g),h(h),ti(ti),ei(ei){} void init(Int n_){ n=1;height=0; while(n &v){ Int n_=v.size(); init(n_); for(Int i=0;i>i); } inline void recalc(Int k){ while(k>>=1) dat[k]=f(reflect((k<<1)|0),reflect((k<<1)|1)); } void update(Int a,Int b,E x){ thrust(a+=n); thrust(b+=n-1); for(Int l=a,r=b+1;l>=1,r>>=1){ if(l&1) laz[l]=h(laz[l],x),l++; if(r&1) --r,laz[r]=h(laz[r],x); } recalc(a); recalc(b); } void set_val(Int a,T x){ thrust(a+=n); dat[a]=x;laz[a]=ei; recalc(a); } T query(Int a,Int b){ thrust(a+=n); thrust(b+=n-1); T vl=ti,vr=ti; for(Int l=a,r=b+1;l>=1,r>>=1) { if(l&1) vl=f(vl,reflect(l++)); if(r&1) vr=f(reflect(--r),vr); } return f(vl,vr); } }; template vector compress(vector v){ sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); return v; } template map dict(const vector &v){ map res; for(Int i=0;i<(Int)v.size();i++) res[v[i]]=i; return res; } //INSERT ABOVE HERE signed main(){ Int n,q; scanf("%lld %lld",&n,&q); vector xs(q),ls(q),rs(q); for(Int i=0;i vs({0,n}); for(Int i=0;i=MOD?a-MOD:a;}; auto mul=[&](Int a,Int b){ Int r=0; while(b){ if(b&1) r=add(r,a); a=add(a,a); b>>=1; } return r; }; using T = pair; using E = pair; T ti(0,0); E ei(1,0); auto f=[&](T a,T b){ return T(add(a.first,b.first),add(a.second,b.second));}; auto g=[&](T a,E b){ return T(add(a.first*b.first,mul(a.second,b.second)),a.second);}; auto h=[&](E a,E b){ return E(a.first*b.first,add(a.second*b.first,b.second));}; vector > segs; for(Int k=0;k<6;k++) segs.emplace_back(f,g,h,ti,ei); vector vt; for(Int i=0;i+1<(Int)vs.size();i++) vt.emplace_back(0,vs[i+1]-vs[i]); for(Int k=0;k<6;k++) segs[k].build(vt); vector ans(6,0); for(Int i=0;i res(6,0); for(Int k=0;k<6;k++) res[k]=segs[k].query(l,r).first; map m; for(Int k=0;k<6;k++) m[res[k]]++; Int v=(--m.end())->first; if(m[v]!=1) continue; for(Int k=0;k<6;k++) if(v==res[k]) ans[k]=add(ans[k],res[k]); }else{ for(Int k=0;k<6;k++){ if(k==x) segs[k].update(l,r,E(1,1)); else segs[k].update(l,r,E(0,0)); } } } for(Int k=0;k<6;k++) ans[k]=add(ans[k],segs[k].query(0,dc[n]).first); printf("%lld %lld %lld %lld %lld\n",ans[1],ans[2],ans[3],ans[4],ans[5]); return 0; }