/*
 * Welcome to my code!
 * -------------------------------------------- *
 * author : lynmisakura(twitter : @andoreiji11)
 */

#include <iostream>
#include <limits.h>
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <cassert>

using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define rrep(i,n) for(int i=n-1;i>=0;i--)
#define repn for(int i = 0;i < n;i++)
#define ain(a) for(auto& i : a)cin >> i;
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x.size())
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define cont continue

//Simple Array Input
#define SAI int n;cin >> n;vi a(n);ain(a)
//Simple Graph Input
#define SGI(m) for(int i=0;i<m;i++){int a,b;cin >> a >> b;g[--a].pb(--b);g[b].pb(a);}
//Simple Tree Input
#define STI SGI(n-1)

typedef long long ll;
typedef long long integer;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vector<int> > vvi;
typedef vector<vector<ll> > vvl;
typedef pair<int,int> pi;
typedef pair<ll,ll> pl;

template<class T> bool chmin(T& a,T b){if(a > b){a = b;return true;}else return false;}
template<class T> bool chmax(T& a,T b){if(a < b){a = b;return true;}else return false;}
template<class T> void print(std::vector<T> a){
    for(int i=0;i<a.size();i++)cout << a[i] << (i < a.size()-1 ? ' ' : '\n');
}
/*
    Dijkstra's algorithm
    qt : https://kopricky.github.io/code/Graph_SP_MST/dijkstra.html
    last checked : 2020.4.22
*/
template<typename T> class Dijkstra {
public:
    struct edge{
        int to; T cost;
    };
    int V;
    vector<vector<edge> > G;
    vector<T> d;
    using pti = pair<T,int>;
    vector<int> prev;
    Dijkstra(int node_size) : V(node_size), G(V), d(V, numeric_limits<T>::max()),prev(node_size,-1){}
    void add_edge(int u,int v,T cost){
        G[u].push_back((edge){v,cost});
    }
    void solve(int s){
        d = vector<T>(V,numeric_limits<T>::max());
        priority_queue<pti,vector<pti>,greater<pti> > que;
        d[s] = 0;
        que.push(pti(0,s));
        while(!que.empty()){
            pti p = que.top();
            que.pop();
            int v = p.second;
            if(d[v] < p.first) continue;
            for(auto& w : G[v]){
                if(d[w.to] > d[v] + w.cost){
                    d[w.to] = d[v] + w.cost;
                    prev[w.to] = v;
                    que.push(pti(d[w.to],w.to));
                }
            }
        }
    }
    vector<int> get_path(int s,int t){
        vector<int> res;
        while(t != s){
            res.push_back(t);
            t = prev[t];
        }
        res.push_back(s);
        reverse(res.begin(),res.end());
        return res;
    }
};

/*
    add_edge : 辺を追加
    solve : dijkstraを実行する 
*/
int main(int argc, char const *argv[])
{
  int n,x,y;cin >> n >> x >> y;
  vector<int> ans(n+1,0);
  Dijkstra<int> G(n);
  rep(i,n-1){
    G.add_edge(i,i+1,1);
    G.add_edge(i+1,i,1);
  }
  G.add_edge(--x,--y,1);
  G.add_edge(y,x,1);
  
  rep(s,n){
    G.solve(s);
    rep(t,n){
      ans[G.d[t]]++;
    }
  }

  rep(i,n-1)cout << ans[i+1] / 2 << '\n';
  return 0;
}


Measured memory_bytes: 384