import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.PrintWriter
import java.util.ArrayDeque

val br = BufferedReader(InputStreamReader(System.`in`))
val out = PrintWriter(System.out)

fun main() {
    br.use { out.use {
        solve()
        out.flush()
    } }
}

fun solve() {
//    幅優先
//    e * e
    val (n, x, y) = readIntegerList()

    /** graph[fromNodeIndex]: edges to other node */
    val edges = Array(n) { mutableListOf<Edge>() }
    repeat(n - 1) {
        edges[it].add(Edge(it, it + 1, 1))
        edges[it + 1].add(Edge(it + 1, it, 1))
    }
    edges[x - 1].add(Edge(x - 1, y - 1, 1))
    edges[y - 1].add(Edge(y - 1, x - 1, 1))

    var ans = LongArray(n - 1)
    for (i in 0 until n) {
        val costArray = IntArray(edges.size)
        val isUnchecked = BooleanArray(edges.size) { true }
        val nodeQueue = ArrayDeque<Int>()
        nodeQueue.addLast(i)
        isUnchecked[i] = false
        while (nodeQueue.isNotEmpty()) {
            val node = nodeQueue.removeFirst()
            for (edge in edges[node]) {
                if (isUnchecked[edge.to]) {
                    costArray[edge.to] = costArray[node] + 1
                    ans[costArray[edge.to] - 1]++
                    isUnchecked[edge.to] = false
                    nodeQueue.addLast(edge.to)
                }
            }
        }
    }
    out.println(ans.map{ it / 2}.joinToString("\n"))
}

/** edge info */
data class Edge(val from: Int, val to: Int, val cost: Long)

fun readInteger() = Integer.parseInt(br.readLine())
fun readLong() = java.lang.Long.parseLong(br.readLine())
fun readStringList() = br.readLine()!!.split(' ')
fun readIntegerList() = readStringList().map(Integer::parseInt)
fun readLongList() = readStringList().map(java.lang.Long::parseLong)
fun readDoubleList() = readStringList().map(java.lang.Double::parseDouble)
