Problem:
Score : 600 points

Problem Statement

There is a grid of squares with H+1 horizontal rows and W vertical columns.

You will start at one of the squares in the top row and repeat moving one square right or down. However, for each integer i from 1 through H, you cannot move down from the A_i-th, (A_i + 1)-th, \ldots, B_i-th squares from the left in the i-th row from the top.

For each integer k from 1 through H, find the minimum number of moves needed to reach one of the squares in the (k+1)-th row from the top. (The starting square can be chosen individually for each case.) If, starting from any square in the top row, none of the squares in the (k+1)-th row can be reached, print -1 instead.

Constraints

1 \leq H,W \leq 2\times 10^5

1 \leq A_i \leq B_i \leq W

Input

Input is given from Standard Input in the following format:

H W
A_1 B_1
A_2 B_2
:
A_H B_H

Output

Print H lines. The i-th line should contain the answer for the case k=i.

Sample Input 1

4 4
2 4
1 1
2 3
2 4

Sample Output 1

1
3
6
-1

Let (i,j) denote the square at the i-th row from the top and j-th column from the left.

For k=1, we need one move such as (1,1) → (2,1).

For k=2, we need three moves such as (1,1) → (2,1) → (2,2) → (3,2).

For k=3, we need six moves such as (1,1) → (2,1) → (2,2) → (3,2) → (3,3) → (3,4) → (4,4).

For k=4, it is impossible to reach any square in the fifth row from the top.

Solution in PyPy3 (7.3.0) (judge verdict: Time Limit Exceeded)

import sys
sys.setrecursionlimit(4100000)

INF = 10 ** 6
H, W = map(int,input().split())
A = []
B = []
for i in range(H):
    a, b = map(int,input().split())
    A.append(a-1)
    B.append(b-1)

ans = [-1 for _ in range(H * W)]
ans2 = [INF] * H

def dfs(x, y, cnt, cnt2):
    if x != 0 and ans[(x-1) * W + y] != -1 and ans[(x-1) * W + y] <= cnt - cnt2:
        return
    if x != 0 and (ans[(x-1) * W + y] == -1 or ans[(x-1) * W + y] > cnt - cnt2):
        ans[(x-1) * W + y] = cnt - cnt2
        ans2[x-1] = min(ans2[x-1], cnt - cnt2)
    if x == H:
        for i in ans2:
            if i == INF:
                print(-1)
            else:
                print(i)
        sys.exit()
    nx = x + 1
    ny = y
    if not A[x] <= ny <= B[x]:
        dfs(nx, ny, cnt + 1, cnt2)
    nx = x
    ny = y + 1
    if ny < W:
        if nx == 0:
            cnt2 += 1
        dfs(nx, ny, cnt + 1, cnt2)

dfs(0, 0, 0, 0)

for i in ans2:
    if i == INF:
        print(-1)
    else:
        print(i)