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 C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
using namespace std;

int main(){
  int h,w;
  cin>>h>>w;
  vector<int> a(h);
  vector<int> b(h);
  vector<vector<int>> m(h+1,vector<int>(w,-1));
  int left_side=0;
  int min_step;
  int num_step;
  for(int i=0;i<w;i++){
    m.at(0).at(i)=0;
  }
  for(int i=0;i<h;i++){
    cin>>a.at(i)>>b.at(i);
    a.at(i)--;
    b.at(i)--;
    num_step=h+w;
    for(int j=left_side;j<w;j++){
      if(j<a.at(i) || j>b.at(i)){
        m.at(i+1).at(j)=m.at(i).at(j)+1;
        num_step=min(m.at(i+1).at(j),num_step);
      }else if(left_side<a.at(i)){
        min_step=h+w;
        for(int k=0;k<j-left_side;k++){
          if(m.at(i+1).at(left_side+k)!=-1){
            min_step=min(m.at(i+1).at(left_side+k)+k+1,min_step);
          }
        }
        m.at(i+1).at(j)=min_step;
      }else{
        left_side=b.at(i)+1;
      }
    }
    if(num_step==h+w){
      cout<<-1<<endl;
    }else{
      cout<<num_step<<endl;
    }
  }
}