#include<iostream>
#include<iomanip>
#include<algorithm>
#include<stack>
#include<queue>
#include<string>
#include<string.h>
#include<cmath>
#include<vector>
#include<map>
#include<unordered_map>
#include<set>
#include<unordered_set>
#include<cstdio>
#include<bitset>
#include<chrono>
#include<random>
#include<ext/rope>
/* ordered_set
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
*/
#define int long long
#define pb push_back
#define fi first
#define se second
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxN = 40 + 5;
const int mod = 1e9 + 7;
const ll oo = 1e18;
int n;
int xg, yg;
ll res[maxN];
vector<pair<int, int>> vc1[maxN], vc2[maxN];
int n1, n2;
struct TPoint
{
    int x, y;
} a[maxN], a1[maxN], a2[maxN];
inline void FastInput()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
}
void ReadInput()
{
    cin >> n >> xg >> yg;
    for(int i=1; i<=n; i++) cin >> a[i].x >> a[i].y;
}
int pos[maxN];
void Attempt1(int t)
{
    if(t == n1 + 1)
    {
        ll x = 0, y = 0;
        int cnt = 0;
        for(int i=1; i<=n1; i++)
        {
            if(pos[i])
            {
                cnt++;
                x += a1[i].x;
                y += a1[i].y;
            }
        }
        vc1[cnt].pb({x, y});
        return;
    }
    for(pos[t]=0; pos[t]<=1; pos[t]++) Attempt1(t + 1);
}
void Attempt2(int t)
{
    if(t == n2 + 1)
    {
        int cnt = 0;
        ll x = 0, y = 0;
        for(int i=1; i<=n2; i++)
        {
            if(pos[i])
            {
                cnt++;
                x += a2[i].x;
                y += a2[i].y;
            }
        }
        vc2[cnt].pb({x, y});
        return;
    }
    for(pos[t]=0; pos[t]<=1; pos[t]++) Attempt2(t + 1);
}
void Solve()
{
    n1 = n / 2;
    n2 = n - n1;
    for(int i=1; i<=n1; i++) a1[i] = a[i];
    for(int i=1; i<=n2; i++) a2[i] = a[i + n1];
    Attempt1(1);
    Attempt2(1);
    for(int i=1; i<=n1; i++)
        sort(vc1[i].begin(), vc1[i].end());
    for(int i=1; i<=n2; i++)
        sort(vc2[i].begin(), vc2[i].end(), greater<pair<int, int>>());
    //for(pair<int, int> v : vc2[4]) cout << v.fi << " " << v.se << '\n';return;
    for(int i=0; i<=n1; i++)
    {
        for(int k=0; k<=n2; k++)
        {
            int p = 0;
            int mul1 = 1;
            for(int j=0; j<vc1[i].size(); j++)
            {
                while(j + 1 < vc1[i].size() && vc1[i][j].fi == vc1[i][j + 1].fi && vc1[i][j].se == vc1[i][j + 1].se)
                {
                    mul1++;
                    j++;
                }
                int x = xg - vc1[i][j].fi, y = yg - vc1[i][j].se;
                while(p < vc2[k].size() && vc2[k][p].fi > x) p++;
                while(p < vc2[k].size() && vc2[k][p].se > y && vc2[k][p].fi == x) p++;
                int mul = 0;
                while(p < vc2[k].size() && vc2[k][p].fi == x && vc2[k][p].se == y)
                {
                    mul++;
                    p++;
                }
                res[i + k] += mul * mul1;
                mul1 = 1;
            }
        }
    }
    for(int i=1; i<=n; i++) cout << res[i] << '\n';
}
int32_t main()
{
    //freopen("x.inp", "r", stdin);
    FastInput();
    ReadInput();
    Solve();
}
