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 Rust (1.15.1) (judge verdict: Accepted)

use std::io::*;
use std::str::FromStr;
use std::collections::BinaryHeap;

struct Graph {
    node: usize,
    directed: bool,
    graph: Vec<Vec<(usize, i64)>>,
}

impl Graph {
    fn new(n: usize, flag: bool) -> Graph {
        Graph { node: n, directed: flag, graph: vec![vec![]; n] }
    }

    fn add_edge(&mut self, start_node: usize, end_node: usize, cost: i64) -> () {
        self.graph[start_node].push((end_node, cost));
        if !self.directed { self.graph[end_node].push((start_node, cost)); }
    }
    fn dijkstra(&self, start_node: usize) -> Vec<i64> {
        let mut dist = vec![std::i64::MAX; self.node];
        dist[start_node] = 0;

        let mut queue: BinaryHeap<(i64, usize)> = BinaryHeap::new();
        queue.push((0, start_node));

        while !queue.is_empty() {
            let (min_dist, idx) = queue.pop().unwrap();
            if dist[idx] < -min_dist {
                continue;
            }
            for &(to, weight) in &self.graph[idx] {
                let cost_cand = dist[idx] + weight;
                if dist[to] > cost_cand {
                    dist[to] = cost_cand;
                    queue.push((-cost_cand, to));
                }
            }
        }
        dist
    }
    fn dijkstra_max(&self, start_node: usize) -> Vec<i64> {
        let mut dist = vec![0; self.node];
        dist[start_node] = 0;

        let mut queue: BinaryHeap<(i64, usize)> = BinaryHeap::new();
        queue.push((0, start_node));

        while !queue.is_empty() {
            let (max_dist, idx) = queue.pop().unwrap();
            if dist[idx] < -max_dist {
                continue;
            }
            for &(to, weight) in &self.graph[idx] {
                let cost_cand = dist[idx] + weight;
                if dist[to] < cost_cand {
                    dist[to] = cost_cand;
                    queue.push((-cost_cand, to));
                }
            }
        }
        dist
    }
}

fn read<T: FromStr>() -> T {
    let stdin = stdin();
    let stdin = stdin.lock();
    let token: String = stdin
        .bytes()
        .map(|c| c.expect("failed to read char") as char) 
        .skip_while(|c| c.is_whitespace())
        .take_while(|c| !c.is_whitespace())
        .collect();
    token.parse().ok().expect("failed to parse token")
}

fn main() {
    let n: usize = read();
    let x: usize = read();
    let y: usize = read();

    let mut g = Graph::new(n+1, false);
    for i in 1..n {
        g.add_edge(i, i+1, 1);
    }
    g.add_edge(x, y, 1);

    let mut ans_vec: Vec<usize> = (0..n+1).map(|_| 0).collect();
    for i in 1..n+1 {
        let v = g.dijkstra(i);
        for hop_num in v.into_iter().skip(i+1) {
            ans_vec[hop_num as usize] += 1;
        }
    }

    for ans in ans_vec.into_iter().skip(1).take(n-1) {
        println!("{}", ans);
    }
}