#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,m;
struct matrix
{
int c[4][4];
matrix(int a[4][4])
{
for(int i=0;i<4;i++)for(int j=0;j<4;j++)c[i][j]=a[i][j];
}
matrix()
{
memset(c,0,sizeof(c));
}
inline void operator=(matrix p)
{
for(int i=0;i<4;i++)for(int j=0;j<4;j++)c[i][j]=p.c[i][j];
}
inline matrix operator+(matrix p)
{
matrix q;
for(int i=0;i<4;i++)for(int j=0;j<4;j++)q.c[i][j]=(c[i][j]+p.c[i][j])%mod;
return q;
}
inline matrix operator*(matrix p)
{
matrix q;
for(int i=0;i<4;i++)for(int j=0;j<4;j++)q.c[i][j]=0;
for(int i=0;i<4;i++)for(int j=0;j<4;j++)
{
(q.c[i][j]+=1ll*c[i][0]*p.c[0][j]%mod)%=mod;
(q.c[i][j]+=1ll*c[i][1]*p.c[1][j]%mod)%=mod;
(q.c[i][j]+=1ll*c[i][2]*p.c[2][j]%mod)%=mod;
(q.c[i][j]+=1ll*c[i][3]*p.c[3][j]%mod)%=mod;
}
return q;
}
}a[250005];
int I_I[4][4]={{1,0,0,0},
{0,1,0,0},
{0,0,1,0},
{0,0,0,1}};
matrix I(I_I);
int A_A[4][4]={{1,0,0,0},
{1,1,0,0},
{0,0,1,0},
{0,0,0,1}};
matrix A(A_A);
int B_B[4][4]={{1,0,0,0},
{0,1,0,0},
{0,1,1,0},
{0,0,0,1}};
matrix B(B_B);
int C_C[4][4]={{1,0,1,0},
{0,1,0,0},
{0,0,1,0},
{0,0,0,1}};;
matrix C(C_C);
int D_D[4][4]={{1,0,0,0},
{0,1,0,0},
{0,0,1,0},
{2,0,0,1}};
matrix D(D_D);
int E_E[4][4]={{1,0,0,0},
{0,2,0,0},
{0,0,1,0},
{0,0,0,1}};
matrix E(E_E);
int F_F[4][4]={{1,0,0,0},
{0,1,0,0},
{0,0,0,0},
{0,0,2,1}};
matrix F(F_F);
struct node
{
matrix sum,lazy;
}sg[1000005];
inline void pushup(int u)
{
sg[u].sum=sg[u<<1].sum+sg[u<<1|1].sum;
}
inline void pushlazy(int u,matrix lz)
{
sg[u].sum=sg[u].sum*lz;
sg[u].lazy=sg[u].lazy*lz;
}
inline void pushdown(int u)
{
pushlazy(u<<1,sg[u].lazy);
pushlazy(u<<1|1,sg[u].lazy);
sg[u].lazy=I;
}
inline void build(int u,int l,int r)
{
sg[u].lazy=I;
if(l==r)
{
sg[u].sum=a[l];
return;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
inline void update(int u,int l,int r,int L,int R,matrix w)
{
if(L<=l&&r<=R)
{
pushlazy(u,w);
return;
}
pushdown(u);
int mid=l+r>>1;
if(L<=mid)update(u<<1,l,mid,L,R,w);
if(R>mid)update(u<<1|1,mid+1,r,L,R,w);
pushup(u);
}
inline matrix query(int u,int l,int r,int L,int R)
{
if(L<=l&&r<=R)return sg[u].sum;
pushdown(u);
int mid=l+r>>1;
matrix ans;
memset(ans.c,0,sizeof(ans.c));
if(L<=mid)ans=ans+query(u<<1,l,mid,L,R);
if(R>mid)ans=ans+query(u<<1|1,mid+1,r,L,R);
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].c[0][0]>>a[i].c[0][1]>>a[i].c[0][2];
a[i].c[0][3]=1;
}
build(1,1,n);
cin>>m;
while(m--)
{
int op,l,r,v;
cin>>op>>l>>r;
if(op==1)update(1,1,n,l,r,A);
if(op==2)update(1,1,n,l,r,B);
if(op==3)update(1,1,n,l,r,C);
if(op==4)
{
cin>>v;
D.c[3][0]=v;
update(1,1,n,l,r,D);
}
if(op==5)
{
cin>>v;
E.c[1][1]=v;
update(1,1,n,l,r,E);
}
if(op==6)
{
cin>>v;
F.c[3][2]=v;
update(1,1,n,l,r,F);
}
if(op==7)
{
matrix ans=query(1,1,n,l,r);
cout<<ans.c[0][0]<<' '<<ans.c[0][1]<<' '<<ans.c[0][2]<<'\n';
}
}
}
已经开O2了