Автор задачи и разработчик: Егор Юлин
Обозначим за $$$C_j$$$ множество боссов, которые могут быть на позиции $$$j$$$, чтобы они удовлетворяли всем условиям сражения Хорнет. Тогда если в конце есть хотя бы одно пустое множество $$$C_j$$$, то ответ «No».
Покажем, как мы будем пересчитывать $$$C_j$$$. Изначально скажем, что во всех позициях могут быть все боссы. Так же будем хранить два дополнительных множества $$$W$$$ и $$$L$$$ — боссы, которых Хорнет с текущими характеристиками может победить, и которым проиграет, соотвественно. При выполнении запросов множество $$$W$$$ никогда не будет уменьшаться, при этом объединение $$$W$$$ и $$$L$$$ дает множество всех боссов.
Тогда запрос второго типа обрабатывается как $$$C_j \gets C_j \cap W$$$, если Хорнет выиграла, и $$$C_j \gets C_j \cap L$$$, если Хорнет проиграла.
Для обработки запроса первого типа необходимо сделать небольшой предпосчет. Заведем многомерный массив $$$\mathtt{a}_{i, j}$$$, в котором $$$i$$$ — номер характеристики, $$$j$$$ — значение $$$i$$$-й характеристики. В данном массиве будем хранить индексы боссов $$$p$$$, у которых $$$b_{p, i} = j$$$. Тогда видно, что $$$j$$$ должно быть не больше $$$500$$$, так как у всех боссов характеристики ограничены $$$500$$$. Значит при помощи такого предпосчета мы умеем узнавать всех боссов, у которых $$$i$$$-я характеристика не меньше, чем у Хорнет, в любой момент времени.
Чтобы понимать, что Хорнет может победить босса, будем для каждого босса хранить число характеристик, которые больше, чем у Хорнет. При увеличении характеристик Хорнет достаточно просмотреть, у каких боссов соответствующие характеристики были больше, а стали меньше, чем у нее, и обновить для этих боссов эту величину.
Таким образом, для решения задачи достаточно аккуратно поддерживать несколько вспомогательных величин и аккуратно пересекать множества возможностей.