- Описание
- Отправленные решения
5. Перемещение чанков
Хранение данных в распределённом хранилище является крайне сложной задачей, однако инженеры Яндекса успешно с ней справляются.
Один из кластеров хранилища состоит из серверов, на которых хранятся данные, разбитые на чанков. Для дефрагментации кластера и возможности отключения старых серверов чанки периодически приходится перемещать между серверами. Перемещение чанков по одному неэффективно, поэтому чанки перемещают группами. Запрос на перемещение чанков описывается четырьмя числами и обозначает заказ на перемещение всех чанков с номерами от до включительно с сервера с номером на сервер с номером . После перемещения соотвествующие чанки с сервера с номером стираются. Таким образом, каждый чанк находится всегда ровно на одном сервере.
При построении распределённых систем очень важно избегать возможности конфликта изменений на кластере. Перед выполнением каждого из запросов необходимо убедиться, что все чанки, участвующие в запросе, находятся на ожидаемом сервере. Иными словами, перед выполнением запроса, описываемого параметрами , необходимо убедиться, что все чанки с номерами от до включительно, расположены на сервере с номером . В случае, если это неверно, запрос на перемещение чанков отменяется, и система переходит к обработке следующего запроса. Если же это верно, то запрос осуществляется и все чанки от до включительно перемещаются с сервера на сервер .
По заданому начальному состоянию кластера и списку запросов перемещения чанков определите, какие запросы будут выполнены.
Формат ввода
В первой строке заданы три целых числа и () — количество чанков на кластере, количество серверов, на которых располагаются чанки, и количество запросов, соответсвенно.
Во второй строке содержатся чисел (), -е из которых обозначает номер сервера, на котором изначально располагается чанк с номером .
В следующих строках содежатся описания запросов перемещения чанков в хронологическом порядке.
Каждый запрос описывается четвёркой чисел () и обозначает заказ на перемещение чанков с номерами с по (включительно) с сервера на сервер .
Формат вывода
Выведите строк. В строке с номером выведите , если запрос с номером будет выполнен, и иначе.
Примечание
Рассмотрим третий пример. Изначально, расположение чанков на серверах описывается массивом .
В первом запросе требуется переместить чанк с номером с сервера на сервер . Чанк с номером находится на сервере , поэтому перемещение будет произведено. После выполнения запроса расположение чанков на серверах описывается массивом .
Во втором запросе требуется переместить чанки и с сервера на сервер . Чанк расположен не на сервере , а на сервере , поэтому операция не будет выполнена. Расположение чанков на серверах останется прежним.
В третьем запросе требуется переместить чанк с сервера на сервер . Чанк находится на сервере , поэтому перемещение будет произведено. После выполнения запроса расположение чанков на серверах будет описываться массивом .
В четвёртом запросе требуется переместить чанки и с сервера на сервер . Так как чанк расположен на сервере , а не на сервере , запрос не будет выполнен и расположение чанков останется прежним.
В пятом запросе требуется переместить чанки и с сервера на сервер , но чанк расположен на сервере , поэтому запрос не будет выполнен, и расположение чанков останется прежним.
В шестом запросе требуется переместить чанк с сервера на сервер . Чанк с номером находится на сервере , поэтому перемещение будет произведено, и расположение чанков станет описываться массивом .
Ограничения
Ограничение времени
1 с
Ограничение памяти
256 МБ
Пример 1
1 2 1
1
1 2 1 1
1
Пример 2
1 2 1
1
2 1 1 1
0
Пример 3
5 5 6
1 2 3 4 5
1 2 1 1
2 3 1 3
4 2 4 4
2 5 1 4
3 2 2 3
3 2 3 3
1
0
1
0
0
1