2025/26, 9-профиль, задание 8 - динамическая память

A: Транспонирование массива

Дана целочисленная матрица размером \(n\times m\). Необходимо вывести транспонированную матрицу, то есть такую, в которой строки становятся столбцами, а столбцы — строками.

Требования к реализации. Для хранения данных используйте динамически выделяемый двумерный массив типа int**. Размеры матрицы заранее неизвестны, поэтому статические массивы использовать нельзя. Память под сам массив и под строки матрицы должна выделяться с помощью оператора new. После завершения работы программы вся выделенная память должна быть освобождена с помощью delete[].

Формат входных данных

Первая строка входных данных содержит числа \(n\) и \(m\), при этом \(nm\le 10^5\). Следующие \(n\) строк содержат по \(m\) целых чисел через пробел.

Формат выходных данных

Программа должна вывести \(m\) строк по \(n\) чисел в каждой, разделяя их пробелами — содержимое транспонированного массива.

Пример

ВводВывод
3 4
11 12 13 14
21 22 23 24
31 32 33 34
11 21 31 
12 22 32 
13 23 33 
14 24 34 

B: Разворот всего

Даны \(n\) одномерных массивов. Необходимо вывести их в обратном порядке: сначала последний массив, потом предпоследний и так далее, при этом элементы каждого массива также выводятся в обратном порядке.

Требования к реализации. Для хранения данных используйте динамически выделяемый двумерный массив типа int**. Для каждого одномерного массива выделяйте память в необходимом количестве. После завершения работы программы вся выделенная память должна быть освобождена с помощью delete[].

Формат входных данных

Первая строка входных данных содержит число \(n\), (\(1\le n\le 10^5\)) — количество массивов. Следующие \(n\) строк содержат описание каждого массива. Описание массива начинается с числа \(s_i\ge 1\) — количество элементов в \(i\)-м массиве. Далее идут \(s_i\) чисел через пробел — элементы одномерного массива. Сумма всех \(s_i\) не превосходит \(2\times 10^5\).

Формат выходных данных

Программа должна вывести \(n\) строк. В каждой строке выведите элементы массива в обратном порядке, разделяя их пробелами. Количество элементов в строке выводить не нужно. Массивы должны выводиться в обратном порядке относительно ввода.

Пример

ВводВывод
3
4 1 2 3 4
2 10 20
3 5 6 7
7 6 5
20 10
4 3 2 1

C: Реализация стеков

Вам необходимо реализовать 100 стеков, поддерживающих операции добавления и удаления элементов. При удалении элемента из стека должно возвращаться его значение, либо сообщаться о том, что операция некорректна (стек пуст).

Требования к реализации. Нельзя использовать никакие контейнеры из стандартной библиотеки C++ (vector, stack, deque, etc). Используете массивы и храните количество элементов в каждом стеке.

Формат входных данных

Первая строка входных данных содержит число \(n\), (\(1\le n\le 1000\)) — количество операций, выполняемых со стеками. Следующие \(n\) строк содержат описание операций. Каждая строка начинается с числа \(s\) (\(1\le |s| \le 100\)), задающего номер стека и тип операции. Если \(s \gt 0\), то в стек с номером \(s\) добавляется целое положительное число, которое записано в этой строке через пробел. Если \(s \lt 0\), то из стека с номером \(-s\) удаляется последнее добавленное в него и не удалённое ранее число.

Формат выходных данных

Для каждой операции удаления числа из стека выведите удаляемое число. Если операция некорректна, то есть стек пуст, выведите число \(-1\).

Пример

ВводВывод
6
1 57
100 15
1 179
-100
-1
-100
15
179
-1

D: Реализация стеков с ограничением по памяти

Вам необходимо реализовать 1000 стеков, поддерживающих операции добавления и удаления элементов. При удалении элемента из стека должно возвращаться его значение, либо сообщаться о том, что операция некорректна (стек пуст).

Требования к реализации. Нельзя использовать никакие контейнеры из стандартной библиотеки C++ (vector, stack, deque, etc). Используете массивы и храните количество элементов в каждом стеке. В этой задаче количество операций велико, поэтому память для каждого стека нужно будет выделять динамически, увеличивая (удваивая) размер памяти, выделенной стеку, при необходимости.

Формат входных данных

Первая строка входных данных содержит число \(n\), (\(1\le n\le 10^5\)) — количество операций, выполняемых со стеками. Следующие \(n\) строк содержат описание операций. Каждая строка начинается с числа \(s\) (\(1\le |s| \le 1000\)), задающего номер стека и тип операции. Если \(s \gt 0\), то в стек с номером \(s\) добавляется целое положительное число, которое записано в этой строке через пробел. Если \(s \lt 0\), то из стека с номером \(-s\) удаляется последнее добавленное в него и не удалённое ранее число.

Формат выходных данных

Для каждой операции удаления числа из стека выведите удаляемое число. Если операция некорректна, то есть стек пуст, выведите число \(-1\).

Пример

ВводВывод
6
1 57
100 15
1 179
-100
-1
-100
15
179
-1