线段树维护矩阵信息
constexpr int inf = 1e9;const int N = 3;using Matrix = array<array<i64, N>, N>;
Matrix operator * (const Matrix &a, const Matrix &b) { Matrix c; // 未初始化 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { i64 res = 0; for (int k = 0; k < N; k++) { res += a[i][k] * b[k][j]; } c[i][j] = res; } } return c;}
const int M = 2e5 + 5;Matrix t[M << 2];void modify(int p, int l, int r, int x, const Matrix &v) { if (l == r) { t[p] = v; return; } int mid = l + r >> 1; if (x <= mid) { modify(p << 1, l, mid, x, v); } else { modify(p << 1 | 1, mid + 1, r, x, v); } t[p] = t[p << 1] * t[p << 1 | 1];}
