Problem:
Score : 400 points

Problem Statement

We have an undirected graph G with N vertices numbered 1 to N and N edges as follows:

For each i=1,2,...,N-1, there is an edge between Vertex i and Vertex i+1.

There is an edge between Vertex X and Vertex Y.

For each k=1,2,...,N-1, solve the problem below:

Find the number of pairs of integers (i,j) (1 \leq i < j \leq N) such that the shortest distance between Vertex i and Vertex j in G is k.

Constraints

3 \leq N \leq 2 \times 10^3

1 \leq X,Y \leq N

X+1 < Y

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N X Y

Output

For each k=1, 2, ..., N-1 in this order, print a line containing the answer to the problem.

Sample Input 1

5 2 4

Sample Output 1

5
4
1
0

The graph in this input is as follows:

There are five pairs (i,j) (1 \leq i < j \leq N) such that the shortest distance between Vertex i and Vertex j is 1: (1,2)\,,(2,3)\,,(2,4)\,,(3,4)\,,(4,5).

There are four pairs (i,j) (1 \leq i < j \leq N) such that the shortest distance between Vertex i and Vertex j is 2: (1,3)\,,(1,4)\,,(2,5)\,,(3,5).

There is one pair (i,j) (1 \leq i < j \leq N) such that the shortest distance between Vertex i and Vertex j is 3: (1,5).

There are no pairs (i,j) (1 \leq i < j \leq N) such that the shortest distance between Vertex i and Vertex j is 4.

Sample Input 2

3 1 3

Sample Output 2

3
0

The graph in this input is as follows:

Sample Input 3

7 3 7

Sample Output 3

7
8
4
2
0
0

Sample Input 4

10 4 8

Sample Output 4

10
12
10
8
4
1
0
0
0

Solution in OCaml (4.02.3) (judge verdict: Time Limit Exceeded)

open Batteries
let add ary value =
  Array.append ary [|value|]

let get_graph n =
  Array.init n (fun a -> [])

(* 頂点数と辺数 *)
let n, x, y = Scanf.sscanf (read_line ()) "%d %d %d" (fun n x y ->
    n, x, y
  )
let graph = get_graph n

let _ =
  let rec loop i =
    if i < n then
      (if i = 0 then
        (graph.(i) <- graph.(i) @ [(i+1)])
        else if i = n-1 then (graph.(i) <- graph.(i) @ [(i-1)]) else graph.(i) <- graph.(i) @ [(i+1); (i-1)]; 
      loop (i+1))
    else ()
  in loop 0;
  graph.(x-1) <- graph.(x-1) @ [y-1];
  graph.(y-1) <- graph.(y-1) @ [x-1]


let get_nagasa x = 
(* 初期条件 (頂点 x を初期ノードとする) *)
(* BFS のためのデータ構造 *)
  let dist = Array.init n (fun a -> -1) in
  let que = Queue.create () in
  let _ =
    dist.(x) <- 0;
    Queue.push x que in
  let rec loop () =
    (* BFS 開始 (キューが空になるまで探索を行う) *)
    if Queue.is_empty que = false then
    (* キューから先頭頂点を取り出す *)
    let v = Queue.take que in
    (* v から辿れる頂点をすべて調べる *)
    let rec search lst =
      match lst with
      | [] -> ()
      | first :: rest ->
        (* すでに発見済みの頂点は探索しない *)
        if dist.(first) = -1 then 
          (* 新たな白色頂点 first について距離情報を更新してキューに追加する *)
          (dist.(first) <- (dist.(v) + 1);
          Queue.push first que;
          search rest)
        else search rest
    in search graph.(v);
    loop () else () 
  in let rec get k =
    if k = n then [] else dist.(k) :: get (k+1)
  in loop (); get 0

let all = 
  let rec loop i =
    if i = n then [] else (get_nagasa i) @ (loop (i+1))
  in loop 0

let count_list lst target =
  let rec loop l =
    match l with
    | [] -> 0
    | first :: rest -> if first = target then 1 + loop rest else loop rest
  in loop lst

let _ =
  for i = 1 to n-1 do
    Printf.printf "%d\n" @@ (count_list all i / 2)
  done