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 Perl (v5.18.2) (judge verdict: Time Limit Exceeded)

use v5.18; # strict say state
use warnings;
use List::Util qw(reduce first max min sum0);

chomp (my ($n, $x, $y) = split / /, <STDIN>);
my %h;
for my $i (1..$n) {
  if ($x == $i) {
    if ($y > $i) {
      $h{$i} = [$i-1, $i+1, $y];
    } else {
      $h{$i} = [$y, $i+1, $i-1];
    }
  } else {
    if ($i==1) {
      $h{$i} = [$i+1];
    } elsif ($i==$n) {
      $h{$i} = [$i-1];
    } else {
      $h{$i} = [$i-1, $i+1];
    }
  }
}
sub member {
    my ($n, $xs) = @_;
    for my $x (@$xs) {
        return 1 if $x eq $n;
    }
    0;
}
my %bh;
sub bfs {
    my ($start, $goal) = @_;
    my @que = ([$start]);
    while (@que > 0) {
        my $path = shift @que;
        my $x = $path->[-1];
        if ($goal eq $x) {
            if (exists $bh{$start.'_'.$goal}) {
              $bh{$start.'_'.$goal} = -1 + scalar @$path if $bh{$start.'_'.$goal} > -1 + scalar @$path;
            } else {
              $bh{$start.'_'.$goal} = -1 + scalar @$path;
            }
        } else {
            my $ls = $h{$x};
            for my $y (@$ls) {
                if (!member($y, $path)) {
                    my $new_path = [@$path];
                    push @$new_path, $y;
                    push @que, $new_path;
                }
            }
        }
    }
}
for my $i (1..$n-1) {
  for my $j ($i+1..$n) {
    bfs($i, $j);
  }
}
my %ans;
$ans{$_}++ for (values %bh);
for my $i (1..$n-1) {
  my $ac = $ans{$i} + 0;
  say $ac;
}