Escrito por Lúcio Figueiredo
Conhecimento prévio necessário:
Note que se o valor de fosse "pequeno" (por exemplo, menor ou igual a
) poderíamos precalcular a resposta de todas as queries usando programação dinâmica, da seguinte forma:
Defina como a resposta de um query se
e
. Assim, podemos calcular
dividindo o problema em dois casos:
- Caso 1:
. Neste caso,
, já que na próxima operação o valor
se tornaria maior que
.
- Caso 2:
. Neste caso,
, já que realizamos uma operação com
e na próxima operação
.
Assim, conseguimos calcular com complexidade
, já que a DP possui
estados e conseguimos realizar a transição em
. No entanto, como o valor de
pode ser "grande" (até
), isso não é suficiente para resolver o problema.
Perceba, porém, que se o valor de uma query for "grande" (maior que
), o número máximo de operações realizadas em tal query é menor ou igual a
, já que em cada operação o valor de
é somado em, pelo menos,
.
Usando este fato, conseguimos chegar em uma solução. Defina como um valor próximo de
. Para este problema, faça
. Calcule
utilizando o método citado acima para todo par
onde
e
. Assim, conseguimos responder as queries quando o valor
é menor ou igual a
. Para queries em que
, podemos simplesmente "simular" todas as operações (ou seja, fazer
) até que o valor
da query se torne maior que
, já que no máximo
operações serão realizadas.
Assim, se for um valor próximo de
(por exemplo,
), conseguimos resolver o problema com complexidade
. Confira o código abaixo para melhor compreensão: