// Slower C++ solution:
//nani?

//omo ta tori da

#include<bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp> // Common file

#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update

#include <ext/pb_ds/detail/standard_policies.hpp>

#define pi acos(-1);

#define fs first

#define sc second

#define pb push_back

#define mp make_pair

#define f(i,a,b) for( int i = a; i < b ; i++ )

#define sor(a) sort( a.begin(), a.end() )

#define rsor(a) sort( a.rbegin(), a.rend() )

#define fastio ios_base::sync_with_stdio(0);cin.tie(0)

#define inf 1LL<<62

typedef long long ll;

typedef double ld;

using namespace std;

using namespace __gnu_pbds;

//const ll inf=1e10;

const ll MOD=1e9+7;

const ll mod=998244353;

const ll N = 1e7 + 5;

// ac cmtr;

const int MAX_N = 2e5+5;

typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;

 

#define TRACE

#ifdef TRACE

#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)

template <typename Arg1>

void __f(const char* name, Arg1&& arg1) {

  cout << name << " : " << arg1 << endl;}

 

template <typename Arg1, typename... Args>

void __f(const char* names, Arg1&& arg1, Args&&... args) {

  const char* comma = strchr(names + 1, ',');

  cout.write(names, comma - names) << " : " << arg1<<" | ";

  __f(comma+1, args...);}

#else

#define trace(...)

#endif

//---------------------------



ll dp[2005][2005];

ll cnt[MAX_N];

ll n;

vector <pair <ll,ll > > adj[MAX_N];



void dij(ll a){



    set <pair <ll,ll> > s;

    f(i,0,n+1) {dp[i][a]=inf;}

    s.insert(mp(0,a));

    dp[a][a] = 0;

    //ans[a] = 1;

    while(!s.empty()){

        ll ini  = s.begin()->sc;s.erase(s.begin());

        for(auto xd : adj[ini]){

            if(dp[xd.fs][a] > dp[ini][a] + xd.sc){

                s.erase(mp(dp[xd.fs][a],xd.fs)); 

                //ans[xd.fs] = ans[ini];

                dp[xd.fs][a] = dp[ini][a] + xd.sc;

                s.insert(mp(dp[xd.fs][a],xd.fs));

            }

        }

        

    }

  return;

}



int main(){

    fastio;

    ll x,y;

    cin>>n>>x>>y;

    f(i,1,n){

        adj[i].pb({i+1,1});

        adj[i+1].pb({i,1});

    }

    adj[x].pb({y,1});

    adj[y].pb({x,1});

    f(i,1,n+1){

        dij(i);

    }

    f(i,1,n+1){

        for(int j=1;j<=n;j++){

            cnt[dp[i][j]]++;

        }

    }

    f(i,1,n){

        cout<<cnt[i]/2<<" "<<endl;

    }





   

}

// Faster C++ solution for the same problem (measured speedup: 6.589557618980616x):
#include <bits/stdc++.h>

using namespace std;



#define rep(i,a,b) for(ll i = (ll)(a); i < (ll)(b); i++)

#define pb push_back

#define mp make_pair

#define ff first

#define ss second

#define trace(x) cout << #x << ": " << x << endl

#define all(x) (x).begin(), (x).end()

#define sz(x) (x).size()

#define INF 1LL<<62



typedef long long ll;

typedef vector<ll> vi;

typedef pair<ll,ll> ii;

typedef vector<ii> vii;



const ll MAX =1e7 +10;

vi arr;



int main(){

  ll n, x, y;

  cin >> n >> x >> y;

  for(int i = n-1; i>0;i--) arr.pb(i);

  

  ll d;

  for(int i = 1; i < y; i++){

    if(y - i <= i - x + 1) break;

    d = (x>i)?(x-i):(i-x);

    rep(i,0,n-y+1)

      arr[d+i]++;

    d = y-i-1;

    rep(i,0,n-y+1)

      arr[d+i]--;

  }

  for(int i = y-1; i > x; i--){

    if(i - x <= y - i + 1) break;

    

    d = y-i;

    rep(i,0,x)

      arr[d+i]++;

    d = i-x-1;

    rep(i,0,x)

      arr[d+i]--;

  }

  ll dx, dy;

  for(int i = x+1; i < y ; i++){

    dx = i - x;

    for(int j = y-1; j > i ;j--){

      dy = y - j;

      if( j - i <= dx+1+dy) break;

      d = dx+dy;

      arr[d]++;

      d = j-i-1;

      arr[d]--;

    }

  }

  rep(i,0,arr.size()){

    cout << arr[i] << endl;

  }

}