#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define cinf(n,x) for(int i=0;i<(n);i++)cin>>x[i];
#define ft first
#define sc second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define all(v) (v).begin(),(v).end()
#define mod 1000000007
#define FS fixed<<setprecision(15)
using namespace std;
typedef long long ll;
template<class T> using V=vector<T>;
using Graph = vector<vector<int>>;
using P=pair<ll,ll>;
typedef unsigned long long ull;
typedef long double ldouble;
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }

const ll INF=1e18;

const ll max_V=100000;//大きすぎ注意

struct edge{ll to,cost;};

ll N;//頂点数
ll M;
//ll cst[max_V][max_V];
vector<edge> G[max_V];

ll d[max_V];//頂点sからの最短距離
ll pr[max_V];

void dijkstra(ll s){
    priority_queue<P,vector<P>,greater<P>> que;
    fill(d,d+N,INF);
    d[s]=0;
    que.push(P(0,s));//pair...first->最短距離、second->頂点

    while(!que.empty()){
        P p=que.top();que.pop();
        ll v=p.second;
        if(d[v]<p.first) continue;
        for(int i=0;i<G[v].size();i++){
            edge e=G[v][i];
            if(d[e.to]>d[v]+e.cost){
                d[e.to]=d[v]+e.cost;
                que.push(P(d[e.to],e.to));
                pr[e.to]=v;
            }
        }
    }
}

//頂点tへの最短路
vector<ll> get_path(ll t){
    vector<ll> path;
    for(;t!=-1;t=pr[t]) path.push_back(t);//tがsになるまでprev[t]をたどっていく
    reverse(all(path));
    return path;
}

// void dijkstra_restore(ll s){
//     fill(d,d+N,INF);
//     fill(used,used+N,0);
//     fill(pr,pr+N,-1);
//     d[s]=0;

//     while(true){
//         ll v=-1;
//         for(int u=0;u<N;u++){
//             if(!used[u]&&(v==-1||d[u]<d[v])) v=u;
//         }

//         if(v==-1) break;
//         used[v]=1;

//         for(int u=0;u<N;u++){
//             if(d[u]>d[v]+cst[v][u]){
//                 d[u]=d[v]+cst[v][u];
//                 pr[u]=v;
//             }
//         }
//     }
// }

//頂点tへの最短路
/*vector<ll> get_path(ll t){
    vector<ll> path;
    for(;t!=-1;t=pr[t]) path.push_back(t);//tがsになるまでprev[t]をたどっていく
    reverse(all(path));
    return path;
}*/
// ll N, M, S;
// ll dist[100009];
// vector<pair<ll, ll>> G[100009];
// priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<pair<ll,ll>>> Q;

// int main() {
//     // グラフを入力する
//     scanf("%d%d", &N, &M);
//     for (int i = 1; i <= M; i++) {
//         ll A,B,C;
//         cin>>A>>B>>C;
//         G[A].push_back(make_pair(B,C));
//         G[B].push_back(make_pair(A,C));
//     }
//     cin>>S;//出発点

//     // 距離を初期化する
//     for (int i = 0; i < N; i++) dist[i] = 1000000000000000000;

//     // 優先度付きキューには (距離, 頂点番号) の組を入れる
//     Q.push(make_pair(0, S));
//     dist[S] = 0;
//     while (!Q.empty()) {
//         int pos = Q.top().second; Q.pop();
//         for (int i = 0; i < G[pos].size(); i++) {
//             int to = G[pos][i].first, cost = G[pos][i].second;
//             if (dist[to] > dist[pos] + cost) {
//                 dist[to] = dist[pos] + cost;
//                 Q.push(make_pair(dist[to], to));
//             }
//         }
//     }

//     // 距離を出力する
//     for (int i = 0; i < N; i++) cout<<dist[i]<<endl;
// }

int main(){
    cin>>N;
    ll x,y;
    cin>>x>>y;
    x--;y--;
    map<ll,ll> mp;
    rep(i,N-1) mp[i]=0;
    rep(i,N-1){
        for(int j=i+1;j<N;j++){
            ll cnt;
            if(i<=x){
                cnt=min((ll)j-i,(ll)x-i+abs(y-j)+1LL);
                mp[cnt]++;
            }else if(i<=y){
                cnt=min((ll)j-i,(ll)i-x+abs(y-j)+1LL);
                mp[cnt]++;
            }else{
                cnt=j-i;
                mp[cnt]++;
            }
        }
    }
    for(int i=1;i<N;i++) cout<<mp[i]<<'\n';
}
//ペナルティ出しても焦らない　ACできると信じろ！！！
/*
V,P(大文字)使用不可
乗算などの際にオーバーフローに注意せよ！
(適切にmodをとれ　にぶたんで途中で切り上げろ)
制約をよく読め！
(全探索できるなら全探索しろ)
stringの計算量(扱い)注意
コーナー注意！(特に数値が小さいものについては要検証)
N行出力のときは'\n'
グリッド上では行先が範囲内におさまるかif文で確認(RE注意)
*/

Measured memory_bytes: 2688