#include<bits/stdc++.h>
using namespace std;
long long n,k,ans,j,m;
const int mod=998244353;
char buf[1<<20], *p1, *p2;
char gc() { return p1 == p2 ? p2 = buf + fread(p1 = buf, 1, 1<<20, stdin), (p1 == p2) ? EOF : *p1++ : *p1++; }
inline int read(int f = 1, char c = gc(), int x = 0) {
while(c < '0' || c > '9') f = (c == '-') ? -1 : 1, c = gc();
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc();
return f * x;
}
struct dcz{
long long mp[4][4];
}tr[1000001],add[1000001],a[250001];
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
return ;
}
long long Mod(int x){
return x>mod?x-mod:x;
}
dcz z;
inline dcz mul(dcz x,dcz y){
memset(z.mp,0,sizeof(z.mp));
for(register int i=0;i<4;++i){
for(register int k=0;k<4;++k){
for(register int j=0;j<4;++j){
z.mp[i][j]=Mod(z.mp[i][j]+(x.mp[i][k]*y.mp[k][j])%mod);
}
}
}
return z;
}
inline void get(dcz &x){
x.mp[0][0]=x.mp[1][1]=x.mp[2][2]=x.mp[3][3]=1;
x.mp[0][1]=x.mp[0][2]=x.mp[0][3]=x.mp[1][0]=x.mp[1][2]=x.mp[1][3]=x.mp[2][1]=x.mp[2][3]=x.mp[2][0]=x.mp[3][0]=x.mp[3][1]=x.mp[3][2]=0;
}
inline dcz a_d_d(dcz x,dcz y){
memset(z.mp,0,sizeof(z.mp));
for(register int i=0;i<4;++i){
z.mp[0][i]=Mod(x.mp[0][i]+y.mp[0][i]);
}
return z;
}
void build(int l,int r,int root){
get(add[root]);
if(l==r){
tr[root]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
tr[root]=a_d_d(tr[root<<1],tr[root<<1|1]);
}
inline bool check(dcz sb){
for(register int i=0;i<4;++i){
for(register int j=0;j<4;++j){
if(i==j&&sb.mp[i][j]!=1)
return 1;
if(i!=j&&sb.mp[i][j]!=0)
return 1;
}
}
return 0;
}
inline void pd(int x){
if(check(add[x])){
add[x<<1]=mul(add[x<<1],add[x]);
add[x<<1|1]=mul(add[x<<1|1],add[x]);
tr[x<<1]=mul(tr[x<<1],add[x]);
tr[x<<1|1]=mul(tr[x<<1|1],add[x]);
get(add[x]);
}
}
void update(int L,int R,int sum,int l,int r,int root,int cz){
if(L<=l&&r<=R){
dcz sb;
get(sb);
if(cz==1){
sb.mp[1][0]=1;
tr[root]=mul(tr[root],sb);
add[root]=mul(add[root],sb);
}
else if(cz==2){
sb.mp[2][1]=1;
tr[root]=mul(tr[root],sb);
add[root]=mul(add[root],sb);
}
else if(cz==3){
sb.mp[0][2]=1;
tr[root]=mul(tr[root],sb);
add[root]=mul(add[root],sb);
}
else if(cz==4){
sb.mp[3][0]=sum;
tr[root]=mul(tr[root],sb);
add[root]=mul(add[root],sb);
}
else if(cz==5){
sb.mp[1][1]=sum;
tr[root]=mul(tr[root],sb);
add[root]=mul(add[root],sb);
}
else{
sb.mp[2][2]=0;
sb.mp[3][2]=sum;
tr[root]=mul(tr[root],sb);
add[root]=mul(add[root],sb);
}
return ;
}
pd(root);
int mid=(l+r)>>1;
if(L<=mid)
update(L,R,sum,l,mid,root<<1,cz);
if(R>mid)
update(L,R,sum,mid+1,r,root<<1|1,cz);
tr[root]=a_d_d(tr[root<<1],tr[root<<1|1]);
}
dcz faq(int L,int R,int l,int r,int root){
if(L<=l&&r<=R){
return tr[root];
}
pd(root);
int mid=(l+r)>>1;
dcz val;
memset(val.mp,0,sizeof(val.mp));
if(L<=mid)
val=a_d_d(val,faq(L,R,l,mid,root<<1));
if(R>mid)
val=a_d_d(val,faq(L,R,mid+1,r,root<<1|1));
return val;
}
signed main(){
ios::sync_with_stdio(0);
cout.tie(0);
n=read();
long long o,x,y,z;
for(register int i=1;i<=n;++i){
x=read(),y=read(),z=read();
a[i].mp[0][0]=x;
a[i].mp[0][1]=y;
a[i].mp[0][2]=z;
a[i].mp[0][3]=1;
}
build(1,n,1);
m=read();
dcz fq;
for(register int i=1;i<=m;++i){
o=read(),x=read(),y=read();
if(o==7){
fq=faq(x,y,1,n,1);
write(fq.mp[0][0]);
putchar(' ');
write(fq.mp[0][1]);
putchar(' ');
write(fq.mp[0][2]);
puts("");
}
else{
if(o>=4) z=read();
update(x,y,z,1,n,1,o);
}
}
return 0;
}