// E03: one logical matrix, two flat representations; optional padding.
#include <iostream>
#include <vector>

int main() {
    const int rows = 2, cols = 3;
    const int row_lda = cols, col_lda = rows;
    std::vector<double> row(rows * row_lda);
    std::vector<double> col(cols * col_lda);
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            const double value = i * cols + j + 1;
            row[i * row_lda + j] = value;
            col[i + j * col_lda] = value;
        }
    }
    std::cout << "row-major:";
    for (double v : row) std::cout << ' ' << v;
    std::cout << "\ncolumn-major:";
    for (double v : col) std::cout << ' ' << v;
    std::cout << '\n';
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            const int r = i * row_lda + j, c = i + j * col_lda;
            const double expected = i * cols + j + 1;
            std::cout << "A(" << i << ',' << j << ")=" << row[r]
                      << " row_offset=" << r << " col_offset=" << c << '\n';
            if (row[r] != expected || col[c] != expected) return 1;
        }
    }
    // Optional extension: physical row length 5, logical row length 3.
    const int lda = 5;
    std::vector<double> padded(rows * lda, -99.0);
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            padded[i * lda + j] = row[i * row_lda + j];
        }
    }
    std::cout << "padded row-major:";
    for (double v : padded) std::cout << ' ' << v;
    std::cout << '\n';
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < lda; ++j) {
            const double expected = (j < cols) ? i * cols + j + 1 : -99;
            if (padded[i * lda + j] != expected) return 1;
        }
    }
    std::cout << "All logical entries and padding checked\n";
    return 0;
}
