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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoders {
	class Program {
		static void Main(string[] args) {

			var inputArray = retreiveLongArray();
			var inputCount = 3;

			// 不正な入力は処理しない
			if (inputArray.Length != inputCount) {
				Console.WriteLine("invalid input");
				return;
			}
			//i,jのすべての組み合わせに対して距離を求める
			// X→Yのルートを使う場合とつかわない場合を算出し、小さいほう
			//kと等しい数を数える

			var N = inputArray[0];
			// X >= Y となるように格納する
			var X = (int)Math.Min(inputArray[1], inputArray[2]);
			var Y = (int)Math.Max(inputArray[1], inputArray[2]);

			//key = k Value=kの登場回数
			var distanceDic = new Dictionary<int,int>();

			for (int i = 1; i <= N; i++) {

				for (int j = 1; j <= N; j++) {
					//i < jのときのみ距離を測る
					if (i <j) {
						var distance = getDistance(i,j,X,Y);
						if (distanceDic.ContainsKey(distance)) {
							distanceDic[distance] += 1;
						}
						else {
							distanceDic.Add(distance,1);
						}
					}
				}
			}

			var sb = new StringBuilder();

			//検証用
			//foreach (var item in distanceList) {
			//	Console.WriteLine(item);
			//}


			for (int k = 1; k < N; k++) {

				if(k != 1) {
					sb.Append("\n");
				}

				if (distanceDic.ContainsKey(k)) {
					sb.Append(distanceDic[k]);
				}
				else {
					sb.Append(0);
				}
				//Console.WriteLine($"k ={k}");(For Test)
			}
			//答えの出力
			Console.WriteLine(sb.ToString());

		}

		/// <summary>
		/// i >j, X>Yとなるように入力　iからjの最短距離求める
		/// </summary>
		/// <param name="i"></param>
		/// <param name="j"></param>
		/// <param name="X"></param>
		/// <param name="Y"></param>
		/// <returns></returns>
		private static int getDistance(int i,int j , int X, int Y) {

			var normalRoute = j - i;
			var jumpRoute = Math.Abs(X - i) + Math.Abs(Y - j) + 1;

			return Math.Min(normalRoute, jumpRoute);
		}

		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static string[] retreiveStringArray() {
			var inputArray =  Console.ReadLine().Split(' ');
			return inputArray;
		}

		/// <summary>
		/// スペースで区切られた整数配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static long[] retreiveLongArray() {
			var inputArray = Console.ReadLine().Split(' ');
			var longArray = inputArray.Select(s => long.Parse(s));
			return longArray.ToArray();
		}
	}
}