239. Сервис подписки

Не решаласьСредняя

В Яндекс Маркете разрабатывают новый сервис для хранения информации про товарные предложения. В MVP планируется поддержать две основные механики: обработка запросов на частичное обновление товарных предложений в базе и отправка обновленных данных сервисам-подписчикам.

Товарное предложение в базе описывается следующей JSON схемой:

offer

При межсервисном взаимодействии к товарному предложению добавляется контекст, который содержит идентификатор для сквозной трассировки, его схема:

message

Сервис, который отправляет запрос на обновление товарного предложения, обязательно заполняет идентификатор оффера (поле $offer.id$) и идентификатор для трассировки (поле $trace\_id$). Все остальные поля в запросе опциональны. В таком случае при применении обновления будет происходить слияние полей. Например, в базе у оффера заполнены поля $price=9990$, и приходит обновление $stock\_count=100$, тогда в базе будут сохранены оба поля $price=9990; stock\_count=100$. Гарантируется, что все входящие запросы валидны и соответствуют схеме. Так как это прототип, удаление товаров из базы и очищение полей было решено не поддерживать.

Помимо хранения товарных предложений в базе, в сервисе необходима функция доставки обновлений в сервисы-подписчиков. Одна подписка включает в себя два набора полей: trigger и shipment, не обязательно листовых. Когда изменяется любое trigger поле или поле, вложенное в trigger поле, подписчику отправляется сообщение. В сообщении находятся все shipment и trigger поля этого подписчика, а также идентификаторы оффера и трассировки из запроса, который привел к этому сообщению. Инициализация поля также считается за его изменении и создает сообщение об обновлении.

Формат ввода

Первая строка входных данных содержит два целых числа $n$ и $m$ ($1 \le n \le 50, 1 \le m \le 10,000$) — количество сервисов подписчиков и количество запросов на обновления.

Следующие $n$ строк содержат описания сервисов подписчиков: $i$-я строка содержит описание $i$-го подписчика. В начале строки задается $a_i$ и $b_i$ — количество trigger и shipment полей соответственно. Далее $a_i$ trigger полей, и $b_i$ shipment полей.

Следующие $m$ строк содержат запросы на обновление, каждая строка — это валидный json, удовлетворяющий схеме $message.schema.json$.

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

На каждое событие обновления выведите $k_j$ сообщений в формате $message.schema.json$, где $k_j$ — это количество сервисов-подписчиков, которым данное событие интересно. Сообщения должны идти в том же порядке, что и обновления, которые привели к ним. Сообщения в рамках одного обновления должны быть отсортированы по порядковому номеру подписчика.

Примечание

Для решений на языке Python доступны библиотеки json, requests и urllib.

Для решений на языке Java доступны библиотеки jackson-core:2.13.1, jackson-annotations:2.13.1 и jackson-databind:2.13.1 . Соответствующие функции импорта могут иметь вид:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;

Для решений на языке C++ доступна библиотека nlohmann/json v3.8.0. Соответствующая директива include выглядит так: #include "json.hpp"

Для решений на языке Golang доступны все стандартные пакеты, включая encoding/json, net/http, sort и другие.

Для решений на C# доступны библиотеки System.Text.Json и Newtonsoft.Json. Соответствующие using могут выглядеть так: using Newtonsoft.Json; using System.Text.Json;

Ограничения

Ограничение времени

8 с

Ограничение памяти

512 МБ

Пример 1

Ввод
2 5
2 0 price stock_count
1 0 partner_content
{"trace_id": "1", "offer": {"id": "1", "price": 9990}}
{"trace_id": "2", "offer": {"id": "1", "stock_count": 100}}
{"trace_id": "3", "offer": {"id": "2", "partner_content": {"title": "Backpack"}}}
{"trace_id": "4", "offer": {"id": "1", "stock_count": 100}}
{"trace_id": "5", "offer": {"id": "2", "partner_content": {"description": "Best backpack ever"}}}
Вывод
{"trace_id":"1","offer":{"id":"1","price":9990}}
{"trace_id":"2","offer":{"id":"1","price":9990,"stock_count":100}}
{"trace_id":"3","offer":{"id":"2","partner_content":{"title":"Backpack"}}}
{"trace_id":"5","offer":{"id":"2","partner_content":{"description":"Best backpack ever","title":"Backpack"}}}

Теги

Нужно войти, чтобы отправить решение.Войти