class SparseMatrixCRS {
public:
    SparseMatrixCRS(int rows, int cols)
        : rows(rows), cols(cols) {
        nonZeroCount = 0;
        for (int i = 0; i <= MAX_ROWS; ++i) {
            row_ptr[i] = 0; // Инициализация указателей
        }
    }

    void addValue(int row, int col, int value) {
        if (value != 0 && nonZeroCount < (row*col)-1) {
            // Добавляем новое ненулевое значение
            val[nonZeroCount] = value;
            col_ind[nonZeroCount] = col;

            // Увеличиваем указатели для строк ниже
            for (int i = row + 1; i <= rows; ++i) {
                row_ptr[i]++;
            }

            nonZeroCount++; // Увеличиваем счетчик ненулевых элементов
        }
    }

    void traverseAndPrintPositive() {
        for (int col = cols - 1; col >= 0; --col) {
            // Проходим от нижней строки к верхней
            for (int r = rows - 1; r >= 0; --r) {
                // Смотрим ненулевые элементы в текущем столбце
                for (int idx = row_ptr[r]; idx < row_ptr[r + 1]; ++idx) {
                    if (col_ind[idx] == col && val[idx] > 0) {
                        std::cout << val[idx] << " ";
                    }
                }
            }
        }
    }


private:
    int rows, cols;
    int nonZeroCount;
    int val[MAX_NON_ZERO];      // Ненулевые значения
    int col_ind[MAX_NON_ZERO];     // Индексы столбцов для ненулевых значений
    int row_ptr[MAX_ROWS + 1];     // Указатели на начало строк
};

bool CorrectSize(int a, int b) {
    if (a > 0 && b > 0) {
        return true;
    }
    else if (std::cin.fail()) {
        std::cin.clear();
        std::cin.ignore(256, '\n');
        std::cout << "Wrong size, try againe" << std::endl;
        return false;
    }
}

bool MatrixValue(int RowP, int ColP, int MatrxRows, int MatrxCols) {
    if (RowP < 0 || ColP < 0 || RowP > MatrxRows - 1 || ColP > MatrxCols - 1 || std::cin.fail()) {
        std::cin.clear();
        std::cin.ignore(256, '\n');
        std::cout << "Wrong position, try again" << std::endl;
        return false;
    }
    return true;
}

bool CorrectCountValue(int ValueCount) {
    if (ValueCount < 0 || std::cin.fail()) {
        std::cin.clear();
        std::cin.ignore(256, '\n');
        std::cout << "The wrong number of elements, try again"<<std::endl;
        return false;
    }
    return true;
}


int main() {
    int rows, cols,RowP,ColP,ValueCount;
    int value,file;
    std::cout << "Enter the size of the matrix" << std::endl;
    do {
        std::cin >> rows >> cols;
    } while (!CorrectSize(rows, cols));
    SparseMatrixCRS mat(rows, cols);

    std::cout << "How many values do you want to add?" << std::endl;
    do {
        std::cin >> ValueCount;
    } while (!CorrectCountValue(ValueCount));
    std::cout << "Entering elements manually [1]" << std::endl;
    std::cout << "Entering elements through a file [2]" << std::endl;
    std::cin >> file;
    if (file == 1) {
        for (ValueCount; ValueCount > 0; ValueCount--) {
            do {
                std::cin >> RowP >> ColP;
            } while (!MatrixValue(RowP, ColP,rows,cols));
            std::cin >> value;
            mat.addValue(RowP, ColP, value);
        }
    }
    else if (file == 2) {
        std::ifstream inputFile("data.txt");
        if (!inputFile.is_open()) {
            std::cerr << "Ошибка: не удалось открыть файл." << std::endl;
            return 1;
        }

        std::string line;
        int linesRead = 0;
        while (linesRead < ValueCount && std::getline(inputFile, line)) {
            std::istringstream iss(line);

            if (iss >> RowP >> ColP >> value) {
                if (MatrixValue(RowP, ColP, rows, cols)) {
                    mat.addValue(RowP, ColP, value);
                    linesRead++;
                }
            }
            else {
                std::cerr << "Ошибка: неверный формат строки: " << line << std::endl;
            }
        }
    }
    else {
        std::cout << "Wrong choice" << std::endl;
        return 0;
    }

    std::cout << "positive elements: ";
    mat.traverseAndPrintPositive();
    return 0;
} можешь переписать данный код, чтобы он удовлетворял таким условиям: Пользователь вводит обычную матрицу, хранится в файле обычная матрица. Ваша программа должна при считывании матрицы её упаковывать. Хранить матрицу в неупакованном виде нельзя. При выводе на экран должны быть:  1-обычная матрица до операции, 2-упакованная матрица до операции, 3-результат