ARC082 F - Sandglass
解法
クエリが時間順で並んでいるので、時刻を進めながらクエリに答えていくことを目指します。
時刻のクエリに答えるには、となるようなの中で最大の時刻まで時を進めて砂の量を調べ、最後にひっくり返す部分だけシミュレートすれば良いです。
よって、それぞれのにて、最初の砂の量がであった場合にどうなっているか、がわかればよいことになります。
また、砂の量をで始めたにも関わらず途中で砂時計の上部の砂が空になり、全て下部にたまった場合、砂の量は始めであった場合と同一視できます。
このような状態になるは、区間になっているので、その境界を見つけることができればよいです。
途中で空にならなかった場合は、砂時計をシミュレートしていった場合の増減を累積和で記録しておくことで、ある時刻における砂の量がわかります。
よって、あとはと同一視できる区間の境界が求まればよいことがわかりました。
まず明らかにの場合、任意のが初めからもしくはであったとわかります。
そうでない場合も、増減の累積和を確認し、ある時刻にになるの区間をマージしていくことで、高速に求めることができます。
感想
おおまかな方針はたっていたのですが、細かい部分を詰めるのに結構時間がかかりました。実装もあんまり綺麗ではない?気がするのでもう少しどうにかしたいです。