洛谷 10pts
#include<bits/stdc++.h>
using namespace std;
const int MAX=3110;
#define qm(x) (x+4)&3
#define ll long long
int n,q,a[MAX][MAX],op,x,y,x2,y2,d,dd,D,ans;
const int mod=1e9+7,mod1=998244353;
inline int read(){
int x=0,f=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^'0');c=getchar();}
return x;
}
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
struct node{
int it[4];ll vd[4];int xd[4];
}e[MAX*MAX];
struct V{
int I;ll val;int d;
} v1,v2;
inline void find(V&,int,int);
inline void link(V,V,int,int,int,int);
inline void run(V&,int);
inline void put(){
find(v1,0,1);
for(int i=1;i<=n;++i){
run(v1,2);
v2=v1;v2.val%=mod;
for(int j=1;j<=n;++j){
// cout<<i<<" "<<j<<" "<<v2.I<<" "<<v2.val<<endl;
// cout<<v2.d<<endl;
run(v2,1);v2.val%=mod;
}
}
}
signed main(){
// freopen("matrix.in","r",stdin);
// freopen("matrix.out","w",stdout);
n=read();q=read();
for(int i=1;i<=n;++i)
for(int j=1,p=i+1;j<=n;++j){
a[i][j]=p;p=1ll*p*(i+1)%mod1;
}
for(int i=0,p=1;i<=n+1;++i)
for(int j=0;j<=n+1;++j){
for(int k=0;k<4;++k){
int x=i+dx[k],y=j+dy[k],P=p+dx[k]*(n+2)+dy[k];
if(x>n+1||x<0||y>n+1||y<0){
e[p].vd[k]=a[i][j];continue;
}
e[p].it[k]=P;e[p].vd[k]=a[i][j]-a[x][y];
}++p;
}
while(q--){
// cout<<"q="<<q<<endl;
op=read();x=read();y=read();x2=read();y2=read();
if(op==1){
dd=x2-x+1;find(v1,x-1,y);find(v2,x,y2);
for(int i=1;i<=dd;++i){
link(v1,v2,0,1,2,1);
run(v1,1);if(i^dd)run(v2,2);
}
run(v1,2);//run(v2,0);
for(int i=1;i<=dd;++i){
link(v1,v2,0,1,3,2);
run(v1,2);if(i^dd)run(v2,3);
}run(v1,3);//run(v2,1);
for(int i=1;i<=dd;++i){
link(v1,v2,0,1,0,3);
run(v1,3);if(i^dd)run(v2,0);
}
run(v1,0);//run(v2,2);
for(int i=1;i<=dd;++i){
// cout<<v1.I<<" "<<v2.I<<endl;
link(v1,v2,0,1,1,0);
run(v1,0);run(v2,1);
}
}else{
D=read();find(v1,x-1,y);find(v2,x,y);
for(int i=1;i<=y2-y+1;++i){
link(v1,v2,D,0,2,0);
run(v1,1);run(v2,1);
} run(v1,2);run(v2,3);
for(int i=1;i<=x2-x+1;++i){
link(v1,v2,D,0,3,1);
run(v1,2);run(v2,2);
}run(v1,3);run(v2,0);
for(int i=1;i<=y2-y+1;++i){
link(v1,v2,D,0,0,2);
run(v1,3);run(v2,3);
}run(v1,0);run(v2,1);
for(int i=1;i<=x2-x+1;++i){
link(v1,v2,D,0,1,3);
run(v1,0);run(v2,0);
}
}
put();
// cout<<e[11].xd[1]<<endl;
}
find(v1,0,1);
for(int i=1,p=12345;i<=n;++i){
run(v1,2);
v2=v1;v2.val%=mod;
for(int j=1;j<=n;++j){
ans=(ans+v2.val*p%mod)%mod;p=1ll*p*12345%mod;
run(v2,1);v2.val%=mod;
}
}
printf("%d",(ans+mod)%mod);
/**/
}
inline void find(V &v,int x,int y){
v={1,0,0};
for(int i=1;i<=x;++i) run(v,2);
for(int i=1;i<=y;++i) run(v,1);
}inline void link(V x,V y,int d1,int d2,int z,int Z1){//x的z方向是y
int X=x.I,Y=y.I;int op=qm(z+x.d);
e[X].it[op]=Y;e[X].vd[op]=x.val-d1-y.val;e[X].xd[op]=qm(x.d-y.d-d2);
// cout<<X<<" "<<op<<" "<<e[X].xd[op]<<endl;
op=qm(Z1+y.d);
e[Y].it[op]=X;e[Y].vd[op]=y.val+d1-x.val;e[Y].xd[op]=qm(y.d-x.d+d2);
}inline void run(V &v,int z){
int op=qm(z+v.d);
v.val-=e[v.I].vd[op];v.d=qm(v.d-e[v.I].xd[op]);
v.I=e[v.I].it[op];
}
/**/