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: