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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false), cin.tie(0)
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn=2e3+10;
int A[maxn];
int n,a,b,huan,l,r;
void check1()
{
		for(int i=1;i<=l;i++){
			int w=(huan-1)/2;
			for(int j=1;j<=w;j++){
				if(j==1)A[i+j]--;
				A[i+j]+=2;
			}
		}
		for(int i=1;i<=r;i++){
			int w=(huan-1)/2;
			for(int j=1;j<=w;j++){
				if(j==1)A[i+j]--;
				A[i+j]+=2;
			}
		}
}
void check2()
{
	for(int i=1;i<=l;i++){
			int w=(huan)/2;
			for(int j=1;j<=w;j++){
				if(j==1||j==w)A[i+j]--;
				A[i+j]+=2;
			}
		}
		for(int i=1;i<=r;i++){
			int w=(huan)/2;
			for(int j=1;j<=w;j++){
				if(j==1||j==w)A[i+j]--;
				A[i+j]+=2;
			}
		}
}
int main()
{
	
	cin>>n>>a>>b;
	huan=a-1+n-b;
	huan=n-huan;
	l=a-1,r=n-b;
	if(huan&1){
	check1();
	}else{
		check2();
	}
	for(int i=1;i<=l+r+1;i++){
		A[l+r+2-i]+=i;
	}
	A[1]--;
	if(huan&1){
		for(int i=1;i<=huan/2;i++){
			A[i]+=huan;
		} 
	} else{
		for(int i=1;i<=huan/2;i++){
			if(i==huan/2)A[i]+=huan/2;
			else A[i]+=huan;
		} 
	}
	for(int i=1;i<n;i++){
		cout<<A[i]<<endl;
	}
 	return 0;
}