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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.awt.*;
import java.io.*;
import java.util.*;

public class Main {
    static ArrayList<Integer> adj[];
    static int c=0;
    static boolean vis[];
    static int cnt[];
    public static void main(String[] args) throws Exception {
        FastReader sc = new FastReader();
        int n=sc.nextInt(),x=sc.nextInt()-1,y=sc.nextInt()-1;
        adj=new ArrayList[n];
        for (int i=0;i<n;i++)adj[i]=new ArrayList<>();
        for (int i=0;i<n-1;i++){
            adj[i].add(i+1);
            adj[i+1].add(i);
        }
        vis=new boolean[n];
        adj[x].add(y);
        adj[y].add(x);
        cnt=new int[n];
        for (int i=0;i<n;i++){
            Arrays.fill(vis,false);
            int dist[]=new int[n];
            LinkedList<Integer> q=new LinkedList<>();
            q.add(i);
            vis[i]=true;
            while (!q.isEmpty()){
                int u=q.poll();
                for (int v:adj[u]){
                    if (vis[v])continue;
                    q.add(v);
                    vis[v]=true;
                    dist[v]=dist[u]+1;
                }
            }
            for (int z:dist)cnt[z]++;
        }
        StringBuilder sb=new StringBuilder();
        for (int i=1;i<n;i++)sb.append(cnt[i]/2+"\n");
        System.out.print(sb);

    }
    static void dfs(int i,int h,int st){
        if (i>st) {
            cnt[h]++;
        }
        if (vis[i])return;
        vis[i]=true;
        for (int u:adj[i]){
            if (vis[u])continue;
            dfs(u,h+1,st);
        }
    }
    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new
                    InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}