import heapq

import sys



input = sys.stdin.readline



def dijkstra(s,edge):

    #始点sから各頂点への最短距離

    d = [10**20] * n

    used = [True] * n #True:未確定

    d[s] = 0

    used[s] = False

    edgelist = []

    for a,b in edge[s]:

        heapq.heappush(edgelist,a*(10**6)+b)

    while len(edgelist):

        minedge = heapq.heappop(edgelist)

        #まだ使われてない頂点の中から最小の距離のものを探す

        if not used[minedge%(10**6)]:

            continue

        v = minedge%(10**6)

        d[v] = minedge//(10**6)

        used[v] = False

        for e in edge[v]:

            if used[e[1]]:

                heapq.heappush(edgelist,(e[0]+d[v])*(10**6)+e[1])

    return d



n,x,y = list(map(int,input().split()))



edge = [[] for i in range(n)]

#edge[i] : iから出る道の[重み,行先]の配列

for i in range(n-1):

    edge[i].append([1,i+1])

    edge[i+1].append([1,i])

edge[x-1].append([1,y-1])

edge[y-1].append([1,x-1])



ans = [0 for _ in range(n)]

for i in range(n):

    #dijkstra(始点,edge)

    res = dijkstra(i,edge)

    for j in range(i+1,n):

        ans[res[j]] += 1



for i in range(1,n):

    print((ans[i]))

import heapq

import sys

def main():

    input = sys.stdin.readline



    def dijkstra(s,edge):

        #始点sから各頂点への最短距離

        d = [10**20] * n

        used = [True] * n #True:未確定

        d[s] = 0

        used[s] = False

        edgelist = []

        for a,b in edge[s]:

            heapq.heappush(edgelist,a*(10**6)+b)

        while len(edgelist):

            minedge = heapq.heappop(edgelist)

            #まだ使われてない頂点の中から最小の距離のものを探す

            if not used[minedge%(10**6)]:

                continue

            v = minedge%(10**6)

            d[v] = minedge//(10**6)

            used[v] = False

            for e in edge[v]:

                if used[e[1]]:

                    heapq.heappush(edgelist,(e[0]+d[v])*(10**6)+e[1])

        return d



    n,x,y = list(map(int,input().split()))



    edge = [[] for i in range(n)]

    #edge[i] : iから出る道の[重み,行先]の配列

    for i in range(n-1):

        edge[i].append((1,i+1))

        edge[i+1].append((1,i))

    edge[x-1].append((1,y-1))

    edge[y-1].append((1,x-1))



    for i in range(n):

        edge[i] = tuple(edge[i])

    edge = tuple(edge)



    ans = [0 for _ in range(n)]

    for i in range(n):

        #dijkstra(始点,edge)

        res = dijkstra(i,edge)

        for j in range(i+1,n):

            ans[res[j]] += 1



    for i in range(1,n):

        print((ans[i]))



if __name__ == '__main__':

    main()

import heapq
import sys

input = sys.stdin.readline


def dijkstra(s, edge):
    # 始点sから各頂点への最短距離
    d = [10**20] * n
    used = [True] * n  # True:未確定
    d[s] = 0
    used[s] = False
    edgelist = []
    for a, b in edge[s]:
        heapq.heappush(edgelist, a * (10**6) + b)
    while len(edgelist):
        minedge = heapq.heappop(edgelist)
        # まだ使われてない頂点の中から最小の距離のものを探す
        if not used[minedge % (10**6)]:
            continue
        v = minedge % (10**6)
        d[v] = minedge // (10**6)
        used[v] = False
        for e in edge[v]:
            if used[e[1]]:
                heapq.heappush(edgelist, (e[0] + d[v]) * (10**6) + e[1])
    return d


n, x, y = list(map(int, input().split()))
edge = [[] for i in range(n)]
# edge[i] : iから出る道の[重み,行先]の配列
for i in range(n - 1):
    edge[i].append([1, i + 1])
    edge[i + 1].append([1, i])
edge[x - 1].append([1, y - 1])
edge[y - 1].append([1, x - 1])
ans = [0 for _ in range(n)]
for i in range(n):
    # dijkstra(始点,edge)
    res = dijkstra(i, edge)
    for j in range(i + 1, n):
        ans[res[j]] += 1
for i in range(1, n):
    print((ans[i]))

import heapq
import sys


def main():
    input = sys.stdin.readline

    def dijkstra(s, edge):
        # 始点sから各頂点への最短距離
        d = [10**20] * n
        used = [True] * n  # True:未確定
        d[s] = 0
        used[s] = False
        edgelist = []
        for a, b in edge[s]:
            heapq.heappush(edgelist, a * (10**6) + b)
        while len(edgelist):
            minedge = heapq.heappop(edgelist)
            # まだ使われてない頂点の中から最小の距離のものを探す
            if not used[minedge % (10**6)]:
                continue
            v = minedge % (10**6)
            d[v] = minedge // (10**6)
            used[v] = False
            for e in edge[v]:
                if used[e[1]]:
                    heapq.heappush(edgelist, (e[0] + d[v]) * (10**6) + e[1])
        return d

    n, x, y = list(map(int, input().split()))
    edge = [[] for i in range(n)]
    # edge[i] : iから出る道の[重み,行先]の配列
    for i in range(n - 1):
        edge[i].append((1, i + 1))
        edge[i + 1].append((1, i))
    edge[x - 1].append((1, y - 1))
    edge[y - 1].append((1, x - 1))
    for i in range(n):
        edge[i] = tuple(edge[i])
    edge = tuple(edge)
    ans = [0 for _ in range(n)]
    for i in range(n):
        # dijkstra(始点,edge)
        res = dijkstra(i, edge)
        for j in range(i + 1, n):
            ans[res[j]] += 1
    for i in range(1, n):
        print((ans[i]))


if __name__ == "__main__":
    main()

-input = sys.stdin.readline + +def main(): +    input = sys.stdin.readline + +    def dijkstra(s, edge): +        # 始点sから各頂点への最短距離 +        d = [10**20] * n +        used = [True] * n  # True:未確定 +        d[s] = 0 +        used[s] = False +        edgelist = [] +        for a, b in edge[s]: +            heapq.heappush(edgelist, a * (10**6) + b) +        while len(edgelist): +            minedge = heapq.heappop(edgelist) +            # まだ使われてない頂点の中から最小の距離のものを探す +            if not used[minedge % (10**6)]: +                continue +            v = minedge % (10**6) +            d[v] = minedge // (10**6) +            used[v] = False +            for e in edge[v]: +                if used[e[1]]: +                    heapq.heappush(edgelist, (e[0] + d[v]) * (10**6) + e[1]) +        return d + +    n, x, y = list(map(int, input().split())) +    edge = [[] for i in range(n)] +    # edge[i] : iから出る道の[重み,行先]の配列 +    for i in range(n - 1): +        edge[i].append((1, i + 1)) +        edge[i + 1].append((1, i)) +    edge[x - 1].append((1, y - 1)) +    edge[y - 1].append((1, x - 1)) +    for i in range(n): +        edge[i] = tuple(edge[i]) +    edge = tuple(edge) +    ans = [0 for _ in range(n)] +    for i in range(n): +        # dijkstra(始点,edge) +        res = dijkstra(i, edge) +        for j in range(i + 1, n): +            ans[res[j]] += 1 +    for i in range(1, n): +        print((ans[i])) -def dijkstra(s, edge): -    # 始点sから各頂点への最短距離 -    d = [10**20] * n -    used = [True] * n  # True:未確定 -    d[s] = 0 -    used[s] = False -    edgelist = [] -    for a, b in edge[s]: -        heapq.heappush(edgelist, a * (10**6) + b) -    while len(edgelist): -        minedge = heapq.heappop(edgelist) -        # まだ使われてない頂点の中から最小の距離のものを探す -        if not used[minedge % (10**6)]: -            continue -        v = minedge % (10**6) -        d[v] = minedge // (10**6) -        used[v] = False -        for e in edge[v]: -            if used[e[1]]: -                heapq.heappush(edgelist, (e[0] + d[v]) * (10**6) + e[1]) -    return d - - -n, x, y = list(map(int, input().split())) -edge = [[] for i in range(n)] -# edge[i] : iから出る道の[重み,行先]の配列 -for i in range(n - 1): -    edge[i].append([1, i + 1]) -    edge[i + 1].append([1, i]) -edge[x - 1].append([1, y - 1]) -edge[y - 1].append([1, x - 1]) -ans = [0 for _ in range(n)] -for i in range(n): -    # dijkstra(始点,edge) -    res = dijkstra(i, edge) -    for j in range(i + 1, n): -        ans[res[j]] += 1 -for i in range(1, n): -    print((ans[i])) +if __name__ == "__main__": +    main()