Glider
Contest: Codeforces Round 509 (Div. 2)
Difficulty rating: 1700
Tags: binary search, data structures, two pointers

A plane is flying at a constant height of $$$h$$$ meters above the ground surface. Let's consider that it is flying from the point $$$(-10^9, h)$$$ to the point $$$(10^9, h)$$$ parallel with $$$Ox$$$ axis.

A glider is inside the plane, ready to start his flight at any moment (for the sake of simplicity let's consider that he may start only when the plane's coordinates are integers). After jumping from the plane, he will fly in the same direction as the plane, parallel to $$$Ox$$$ axis, covering a unit of distance every second. Naturally, he will also descend; thus his second coordinate will decrease by one unit every second.

There are ascending air flows on certain segments, each such segment is characterized by two numbers $$$x_1$$$ and $$$x_2$$$ ($$$x_1 < x_2$$$) representing its endpoints. No two segments share any common points. When the glider is inside one of such segments, he doesn't descend, so his second coordinate stays the same each second. The glider still flies along $$$Ox$$$ axis, covering one unit of distance every second.

If the glider jumps out at $$$1$$$, he will stop at $$$10$$$. Otherwise, if he jumps out at $$$2$$$, he will stop at $$$12$$$.

Determine the maximum distance along $$$Ox$$$ axis from the point where the glider's flight starts to the point where his flight ends if the glider can choose any integer coordinate to jump from the plane and start his flight. After touching the ground the glider stops altogether, so he cannot glide through an ascending airflow segment if his second coordinate is $$$0$$$.

Input format:
The first line contains two integers $$$n$$$ and $$$h$$$ $$$(1 \le n \le 2\cdot10^{5}, 1 \le h \le 10^{9})$$$ — the number of ascending air flow segments and the altitude at which the plane is flying, respectively.

Each of the next $$$n$$$ lines contains two integers $$$x_{i1}$$$ and $$$x_{i2}$$$ $$$(1 \le x_{i1} < x_{i2} \le 10^{9})$$$ — the endpoints of the $$$i$$$-th ascending air flow segment. No two segments intersect, and they are given in ascending order.

Output format:
Print one integer — the maximum distance along $$$Ox$$$ axis that the glider can fly from the point where he jumps off the plane to the point where he lands if he can start his flight at any integer coordinate.

Constraints:
Time limit: 2.0 s
Memory limit: 256.0 MB

Note:
In the first example if the glider can jump out at $$$(2, 4)$$$, then the landing point is $$$(12, 0)$$$, so the distance is $$$12-2 = 10$$$.

In the second example the glider can fly from $$$(16,10)$$$ to $$$(34,0)$$$, and the distance is $$$34-16=18$$$.

In the third example the glider can fly from $$$(-100,1000000000)$$$ to $$$(1999999899,0)$$$, so the distance is $$$1999999899-(-100)=1999999999$$$.

Example input:
3 4
2 5
7 9
10 11

Example output:
10

Example input:
5 10
5 7
11 12
16 20
25 26
30 33

Example output:
18

Editorial:
At first, let's prove that it is always optimal to jump out at the beginning of any ascending air flows: if his point of jump is out of any air flow, he can move his point to $$$+1$$$ — answer will not decrease, in the same way, if his point of jump in some air flow but not in its beginning, he can move his point to $$$-1$$$.
Next observation: height of glider is non-ascending function for the fixed point of jump, so we can for each optimal point of jump use binary search of the answer. Let glider jump out at position $$$x$$$ and we need to calculate its height at some position $$$y \ge x$$$, then height is equal to $$$h - (y - x) + sum(x,y)$$$, where $$$sum(x,y)$$$ is a total length of all flows of segment $$$[x, y]$$$ and can be calculated using prefix sums (yes, and $$$lower\_bound$$$).
Result complexity — $$$O(n \log(10^9) \log(n))$$$ of time and $$$O(n)$$$ of memory.
Of course, you can note that this task can be solved with two pointers technique, what is faster, but it is not necessary since built in $$$lower\_bound$$$ function is fast enough (unlike some $$$set$$$ or segment tree, which should be written optimally).
On the other hand, java-users need to do some extra work by writing its own $$$lower\_bound$$$ function for $$$int[]$$$ since $$$binary\_search(List<>)$$$ will cause a slowdown.