#include<bits/stdc++.h>
using namespace std;
int n,m,op,v,q1,q2,mod=998244353;
struct matrix{
int m[5][5];
matrix(){
memset(m,0,sizeof(m));
}
matrix operator+(const matrix &a)const{
matrix b;
for(int i=0;i<=3;i++){
for(int j=0;j<=3;j++) b.m[i][j]=(m[i][j]+a.m[i][j])%mod;
}
return b;
}
matrix operator*(const matrix &a)const{
matrix b;
for(int i=0;i<=3;i++){
for(int j=0;j<=3;j++){
for(int k=0;k<=3;k++) b.m[i][j]=(b.m[i][j]+1ll*m[i][k]*a.m[k][j]%mod)%mod;
}
}
return b;
}
}a[250001],node[1000001],lazy[1000001],dp[7];
void build(int rt,int l,int r){
lazy[rt].m[0][0]=lazy[rt].m[1][1]=lazy[rt].m[2][2]=lazy[rt].m[3][3]=1;
if(l==r){
node[rt]=a[l];
return;
}
int mid=(l+r)>>1;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
node[rt]=node[rt*2]+node[rt*2+1];
}
void push_down(int rt){
node[rt*2]=node[rt*2]*lazy[rt];
node[rt*2+1]=node[rt*2+1]*lazy[rt];
lazy[rt*2]=lazy[rt*2]*lazy[rt];
lazy[rt*2+1]=lazy[rt*2+1]*lazy[rt];
memset(lazy[rt].m,0,sizeof(lazy[rt].m));
lazy[rt].m[0][0]=lazy[rt].m[1][1]=lazy[rt].m[2][2]=lazy[rt].m[3][3]=1;
}
void updata(int rt,int l,int r,int L,int R,matrix val){
if(L<=l&&r<=R){
node[rt]=node[rt]*val;
lazy[rt]=lazy[rt]*val;
return;
}
push_down(rt);
int mid=(l+r)>>1;
if(L<=mid) updata(rt*2,l,mid,L,R,val);
if(mid+1<=R) updata(rt*2+1,mid+1,r,L,R,val);
node[rt]=node[rt*2]+node[rt*2+1];
}
matrix query(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R) return node[rt];
push_down(rt);
int mid=(l+r)>>1;
matrix res;
if(L<=mid) res=res+query(rt*2,l,mid,L,R);
if(mid+1<=R) res=res+query(rt*2+1,mid+1,r,L,R);
return res;
}
int main(){
dp[1].m[0][0]=dp[1].m[1][0]=dp[1].m[1][1]=dp[1].m[2][2]=dp[1].m[3][3]=1;
dp[2].m[0][0]=dp[2].m[1][1]=dp[2].m[2][1]=dp[2].m[2][2]=dp[2].m[3][3]=1;
dp[3].m[0][0]=dp[3].m[0][2]=dp[3].m[1][1]=dp[3].m[2][2]=dp[3].m[3][3]=1;
dp[4].m[0][0]=dp[4].m[1][1]=dp[4].m[2][2]=dp[4].m[3][3]=1;
dp[5].m[0][0]=dp[5].m[2][2]=dp[5].m[3][3]=1;
dp[6].m[0][0]=dp[6].m[1][1]=dp[6].m[3][3]=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a[i].m[0][0],&a[i].m[0][1],&a[i].m[0][2]);
a[i].m[0][3]=1;
}
build(1,1,n);
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&op,&q1,&q2);
if(op>=4&&op<=6) scanf("%d",&v);
if(op==4) dp[4].m[3][0]=v;
if(op==5) dp[5].m[1][1]=v;
if(op==6) dp[6].m[3][2]=v;
if(op==7){
matrix ans=query(1,1,n,q1,q2);
printf("%d %d %d\n",ans.m[0][0],ans.m[0][1],ans.m[0][2]);
}
else updata(1,1,n,q1,q2,dp[op]);
}
return 0;
}