#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
const int N = 200005;
int modpow(int a, int e, int mod) {
int res = 1;
while (e) {
if (e & 1) res = 1LL * res * a % mod;
a = 1LL * a * a % mod;
e >>= 1;
}
return res;
}
int inv(int x) {
return modpow(x, MOD - 2, MOD);
}
struct Matrix {
int m[3][3];
Matrix() {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
m[i][j] = (i == j ? 1 : 0);
}
Matrix operator*(const Matrix& other) const {
Matrix res;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
long long sum = 0;
for (int k = 0; k < 3; k++) {
sum += 1LL * m[i][k] * other.m[k][j] % MOD;
}
res.m[i][j] = sum % MOD;
}
}
return res;
}
};
Matrix gold(int a, int b, int c) {
Matrix M;
long long S = (1LL * a * a + 1LL * b * b) % MOD;
long long invS = inv(S);
// M = I - [a; b; 0] * [a, b, c] * invS
M.m[0][0] = (1 - 1LL * a * a % MOD * invS % MOD + MOD) % MOD;
M.m[0][1] = (0 - 1LL * a * b % MOD * invS % MOD + MOD) % MOD;
M.m[0][2] = (0 - 1LL * a * c % MOD * invS % MOD + MOD) % MOD;
M.m[1][0] = (0 - 1LL * a * b % MOD * invS % MOD + MOD) % MOD;
M.m[1][1] = (1 - 1LL * b * b % MOD * invS % MOD + MOD) % MOD;
M.m[1][2] = (0 - 1LL * b * c % MOD * invS % MOD + MOD) % MOD;
M.m[2][0] = 0;
M.m[2][1] = 0;
M.m[2][2] = 1;
return M;
}
Matrix diamond(int a, int b, int c) {
Matrix M;
long long S = (1LL * a * a + 1LL * b * b) % MOD;
long long invS = inv(S);
M.m[0][0] = (1 - 2LL * a * a % MOD * invS % MOD + MOD) % MOD;
M.m[0][1] = (0 - 2LL * a * b % MOD * invS % MOD + MOD) % MOD;
M.m[0][2] = (0 - 2LL * a * c % MOD * invS % MOD + MOD) % MOD;
M.m[1][0] = (0 - 2LL * a * b % MOD * invS % MOD + MOD) % MOD;
M.m[1][1] = (1 - 2LL * b * b % MOD * invS % MOD + MOD) % MOD;
M.m[1][2] = (0 - 2LL * b * c % MOD * invS % MOD + MOD) % MOD;
M.m[2][0] = 0;
M.m[2][1] = 0;
M.m[2][2] = 1;
return M;
}
Matrix seg[4 * N];
Matrix mats[N];
void build(int idx, int l, int r) {
if (l == r) {
seg[idx] = mats[l];
return;
}
int mid = (l + r) / 2;
build(idx * 2, l, mid);
build(idx * 2 + 1, mid + 1, r);
seg[idx] = seg[idx * 2 + 1] * seg[idx * 2]; // thứ tự ngược: r...l
}
void update(int idx, int l, int r, int pos, Matrix val) {
if (l == r) {
seg[idx] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid) update(idx * 2, l, mid, pos, val);
else update(idx * 2 + 1, mid + 1, r, pos, val);
seg[idx] = seg[idx * 2 + 1] * seg[idx * 2];
}
Matrix query(int idx, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return seg[idx];
int mid = (l + r) / 2;
if (qr <= mid) return query(idx * 2, l, mid, ql, qr);
if (ql > mid) return query(idx * 2 + 1, mid + 1, r, ql, qr);
return query(idx * 2 + 1, mid + 1, r, ql, qr) * query(idx * 2, l, mid, ql, qr);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++) {
char ch;
int a, b, c;
cin >> ch >> a >> b >> c;
a = (a % MOD + MOD) % MOD;
b = (b % MOD + MOD) % MOD;
c = (c % MOD + MOD) % MOD;
if (ch == 'G') {
mats[i] = gold(a, b, c);
} else {
mats[i] = diamond(a, b, c);
}
}
build(1, 1, n);
while (q--) {
int t;
cin >> t;
if (t == 1) {
int j, a, b, c;
char m;
cin >> j >> m >> a >> b >> c;
a = (a % MOD + MOD) % MOD;
b = (b % MOD + MOD) % MOD;
c = (c % MOD + MOD) % MOD;
if (m == 'G') {
update(1, 1, n, j, gold(a, b, c));
} else {
update(1, 1, n, j, diamond(a, b, c));
}
} else {
int x, y, l, r;
cin >> x >> y >> l >> r;
x = (x % MOD + MOD) % MOD;
y = (y % MOD + MOD) % MOD;
Matrix M = query(1, 1, n, l, r);
int xf = (1LL * M.m[0][0] * x + 1LL * M.m[0][1] * y + M.m[0][2]) % MOD;
int yf = (1LL * M.m[1][0] * x + 1LL * M.m[1][1] * y + M.m[1][2]) % MOD;
cout << xf << " " << yf << "\n";
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTU9EID0gOTk4MjQ0MzUzOwpjb25zdCBpbnQgTiA9IDIwMDAwNTsKCmludCBtb2Rwb3coaW50IGEsIGludCBlLCBpbnQgbW9kKSB7CiAgICBpbnQgcmVzID0gMTsKICAgIHdoaWxlIChlKSB7CiAgICAgICAgaWYgKGUgJiAxKSByZXMgPSAxTEwgKiByZXMgKiBhICUgbW9kOwogICAgICAgIGEgPSAxTEwgKiBhICogYSAlIG1vZDsKICAgICAgICBlID4+PSAxOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKaW50IGludihpbnQgeCkgewogICAgcmV0dXJuIG1vZHBvdyh4LCBNT0QgLSAyLCBNT0QpOwp9CgpzdHJ1Y3QgTWF0cml4IHsKICAgIGludCBtWzNdWzNdOwogICAgTWF0cml4KCkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykKICAgICAgICAgICAgICAgIG1baV1bal0gPSAoaSA9PSBqID8gMSA6IDApOwogICAgfQogICAgTWF0cml4IG9wZXJhdG9yKihjb25zdCBNYXRyaXgmIG90aGVyKSBjb25zdCB7CiAgICAgICAgTWF0cml4IHJlczsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewogICAgICAgICAgICAgICAgbG9uZyBsb25nIHN1bSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDM7IGsrKykgewogICAgICAgICAgICAgICAgICAgIHN1bSArPSAxTEwgKiBtW2ldW2tdICogb3RoZXIubVtrXVtqXSAlIE1PRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcy5tW2ldW2pdID0gc3VtICUgTU9EOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9Cn07CgpNYXRyaXggZ29sZChpbnQgYSwgaW50IGIsIGludCBjKSB7CiAgICBNYXRyaXggTTsKICAgIGxvbmcgbG9uZyBTID0gKDFMTCAqIGEgKiBhICsgMUxMICogYiAqIGIpICUgTU9EOwogICAgbG9uZyBsb25nIGludlMgPSBpbnYoUyk7CiAgICAvLyBNID0gSSAtIFthOyBiOyAwXSAqIFthLCBiLCBjXSAqIGludlMKICAgIE0ubVswXVswXSA9ICgxIC0gMUxMICogYSAqIGEgJSBNT0QgKiBpbnZTICUgTU9EICsgTU9EKSAlIE1PRDsKICAgIE0ubVswXVsxXSA9ICgwIC0gMUxMICogYSAqIGIgJSBNT0QgKiBpbnZTICUgTU9EICsgTU9EKSAlIE1PRDsKICAgIE0ubVswXVsyXSA9ICgwIC0gMUxMICogYSAqIGMgJSBNT0QgKiBpbnZTICUgTU9EICsgTU9EKSAlIE1PRDsKICAgIE0ubVsxXVswXSA9ICgwIC0gMUxMICogYSAqIGIgJSBNT0QgKiBpbnZTICUgTU9EICsgTU9EKSAlIE1PRDsKICAgIE0ubVsxXVsxXSA9ICgxIC0gMUxMICogYiAqIGIgJSBNT0QgKiBpbnZTICUgTU9EICsgTU9EKSAlIE1PRDsKICAgIE0ubVsxXVsyXSA9ICgwIC0gMUxMICogYiAqIGMgJSBNT0QgKiBpbnZTICUgTU9EICsgTU9EKSAlIE1PRDsKICAgIE0ubVsyXVswXSA9IDA7CiAgICBNLm1bMl1bMV0gPSAwOwogICAgTS5tWzJdWzJdID0gMTsKICAgIHJldHVybiBNOwp9CgpNYXRyaXggZGlhbW9uZChpbnQgYSwgaW50IGIsIGludCBjKSB7CiAgICBNYXRyaXggTTsKICAgIGxvbmcgbG9uZyBTID0gKDFMTCAqIGEgKiBhICsgMUxMICogYiAqIGIpICUgTU9EOwogICAgbG9uZyBsb25nIGludlMgPSBpbnYoUyk7CiAgICBNLm1bMF1bMF0gPSAoMSAtIDJMTCAqIGEgKiBhICUgTU9EICogaW52UyAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICBNLm1bMF1bMV0gPSAoMCAtIDJMTCAqIGEgKiBiICUgTU9EICogaW52UyAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICBNLm1bMF1bMl0gPSAoMCAtIDJMTCAqIGEgKiBjICUgTU9EICogaW52UyAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICBNLm1bMV1bMF0gPSAoMCAtIDJMTCAqIGEgKiBiICUgTU9EICogaW52UyAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICBNLm1bMV1bMV0gPSAoMSAtIDJMTCAqIGIgKiBiICUgTU9EICogaW52UyAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICBNLm1bMV1bMl0gPSAoMCAtIDJMTCAqIGIgKiBjICUgTU9EICogaW52UyAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICBNLm1bMl1bMF0gPSAwOwogICAgTS5tWzJdWzFdID0gMDsKICAgIE0ubVsyXVsyXSA9IDE7CiAgICByZXR1cm4gTTsKfQoKTWF0cml4IHNlZ1s0ICogTl07Ck1hdHJpeCBtYXRzW05dOwoKdm9pZCBidWlsZChpbnQgaWR4LCBpbnQgbCwgaW50IHIpIHsKICAgIGlmIChsID09IHIpIHsKICAgICAgICBzZWdbaWR4XSA9IG1hdHNbbF07CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgYnVpbGQoaWR4ICogMiwgbCwgbWlkKTsKICAgIGJ1aWxkKGlkeCAqIDIgKyAxLCBtaWQgKyAxLCByKTsKICAgIHNlZ1tpZHhdID0gc2VnW2lkeCAqIDIgKyAxXSAqIHNlZ1tpZHggKiAyXTsgLy8gdGjhu6kgdOG7sSBuZ8aw4bujYzogci4uLmwKfQoKdm9pZCB1cGRhdGUoaW50IGlkeCwgaW50IGwsIGludCByLCBpbnQgcG9zLCBNYXRyaXggdmFsKSB7CiAgICBpZiAobCA9PSByKSB7CiAgICAgICAgc2VnW2lkeF0gPSB2YWw7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgaWYgKHBvcyA8PSBtaWQpIHVwZGF0ZShpZHggKiAyLCBsLCBtaWQsIHBvcywgdmFsKTsKICAgIGVsc2UgdXBkYXRlKGlkeCAqIDIgKyAxLCBtaWQgKyAxLCByLCBwb3MsIHZhbCk7CiAgICBzZWdbaWR4XSA9IHNlZ1tpZHggKiAyICsgMV0gKiBzZWdbaWR4ICogMl07Cn0KCk1hdHJpeCBxdWVyeShpbnQgaWR4LCBpbnQgbCwgaW50IHIsIGludCBxbCwgaW50IHFyKSB7CiAgICBpZiAocWwgPD0gbCAmJiByIDw9IHFyKSByZXR1cm4gc2VnW2lkeF07CiAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICBpZiAocXIgPD0gbWlkKSByZXR1cm4gcXVlcnkoaWR4ICogMiwgbCwgbWlkLCBxbCwgcXIpOwogICAgaWYgKHFsID4gbWlkKSByZXR1cm4gcXVlcnkoaWR4ICogMiArIDEsIG1pZCArIDEsIHIsIHFsLCBxcik7CiAgICByZXR1cm4gcXVlcnkoaWR4ICogMiArIDEsIG1pZCArIDEsIHIsIHFsLCBxcikgKiBxdWVyeShpZHggKiAyLCBsLCBtaWQsIHFsLCBxcik7Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgCiAgICBpbnQgbiwgcTsKICAgIGNpbiA+PiBuID4+IHE7CiAgICAKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGNoYXIgY2g7CiAgICAgICAgaW50IGEsIGIsIGM7CiAgICAgICAgY2luID4+IGNoID4+IGEgPj4gYiA+PiBjOwogICAgICAgIGEgPSAoYSAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICAgICAgYiA9IChiICUgTU9EICsgTU9EKSAlIE1PRDsKICAgICAgICBjID0gKGMgJSBNT0QgKyBNT0QpICUgTU9EOwogICAgICAgIGlmIChjaCA9PSAnRycpIHsKICAgICAgICAgICAgbWF0c1tpXSA9IGdvbGQoYSwgYiwgYyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWF0c1tpXSA9IGRpYW1vbmQoYSwgYiwgYyk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBidWlsZCgxLCAxLCBuKTsKICAgIAogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCB0OwogICAgICAgIGNpbiA+PiB0OwogICAgICAgIGlmICh0ID09IDEpIHsKICAgICAgICAgICAgaW50IGosIGEsIGIsIGM7CiAgICAgICAgICAgIGNoYXIgbTsKICAgICAgICAgICAgY2luID4+IGogPj4gbSA+PiBhID4+IGIgPj4gYzsKICAgICAgICAgICAgYSA9IChhICUgTU9EICsgTU9EKSAlIE1PRDsKICAgICAgICAgICAgYiA9IChiICUgTU9EICsgTU9EKSAlIE1PRDsKICAgICAgICAgICAgYyA9IChjICUgTU9EICsgTU9EKSAlIE1PRDsKICAgICAgICAgICAgaWYgKG0gPT0gJ0cnKSB7CiAgICAgICAgICAgICAgICB1cGRhdGUoMSwgMSwgbiwgaiwgZ29sZChhLCBiLCBjKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1cGRhdGUoMSwgMSwgbiwgaiwgZGlhbW9uZChhLCBiLCBjKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgeCwgeSwgbCwgcjsKICAgICAgICAgICAgY2luID4+IHggPj4geSA+PiBsID4+IHI7CiAgICAgICAgICAgIHggPSAoeCAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICAgICAgICAgIHkgPSAoeSAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICAgICAgICAgIE1hdHJpeCBNID0gcXVlcnkoMSwgMSwgbiwgbCwgcik7CiAgICAgICAgICAgIGludCB4ZiA9ICgxTEwgKiBNLm1bMF1bMF0gKiB4ICsgMUxMICogTS5tWzBdWzFdICogeSArIE0ubVswXVsyXSkgJSBNT0Q7CiAgICAgICAgICAgIGludCB5ZiA9ICgxTEwgKiBNLm1bMV1bMF0gKiB4ICsgMUxMICogTS5tWzFdWzFdICogeSArIE0ubVsxXVsyXSkgJSBNT0Q7CiAgICAgICAgICAgIGNvdXQgPDwgeGYgPDwgIiAiIDw8IHlmIDw8ICJcbiI7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQ==