#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;
typedef long long ll;
typedef pair<int, int> P;
vector<P> d1, d2;
int N, D1, D2;

vector<P> G1[605][605], G2[605][605];
int dx[4] = {1, 1, -1, -1};
int dy[4] = {1, -1, 1, -1};

bool used1[605][605];
bool used2[605][605];
int col1[605][605];
int col2[605][605];

bool isInField(int x, int y){
    return x >= 0 && x <= 2*N && y >= 0 && y <= 2*N;
}

void dfs1(P p, int c){
    int x = p.first, y = p.second;
    // cout << x << ' ' << y << ' ' << c << endl;
    used1[x][y] = true;
    col1[x][y] = c;
    for(int i = 0; i < G1[x][y].size(); i++){
        int s = G1[x][y][i].first;
        int t = G1[x][y][i].second;
        if(!used1[s][t]) dfs1(P(s, t), c^1);
    }
}

void dfs2(P p, int c){
    int x = p.first, y = p.second;
    // cout << x << ' ' << y << endl;
    used2[x][y] = true;
    col2[x][y] = c;
    for(int i = 0; i < G2[x][y].size(); i++){
        int s = G2[x][y][i].first;
        int t = G2[x][y][i].second;
        if(!used2[s][t]) dfs2(P(s, t), c^1);
    }
}

int cnt[2][2];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout << setprecision(10) << fixed;
    cin >> N >> D1 >> D2;
    for(int i = 0; i*i <= D1; i++){
        for(int j = 0; j*j <= D1; j++){
            if(i*i+j*j == D1){
                d1.push_back(P(i, j));
            }
        }
    }
    for(int i = 0; i*i <= D2; i++){
        for(int j = 0; j*j <= D2; j++){
            if(i*i+j*j == D2){
                d2.push_back(P(i, j));
            }
        }
    }
    for(int i = 0; i < 2*N; i++){
        for(int j = 0; j < 2*N; j++){
            P p = P(i, j);
            for(int k = 0; k < d1.size(); k++){
                int s = d1[k].first;
                int t = d1[k].second;
                for(int l = 0; l < 4; l++){
                    int x = i+dx[l]*s;
                    int y = j+dy[l]*t;
                    if(isInField(x, y)){
                        // cout << i << ' ' << j << ':' << x << ' ' << y << endl;
                        G1[i][j].push_back(P(x, y));
                    }
                }
            }
        }
    }
    // for(int k = 0; k < d1.size(); k++){
    //     cout << d1[k].first << ' ' << d1[k].second << endl;
    // }
    // for(int k = 0; k < d2.size(); k++){
    //     cout << d2[k].first << ' ' << d2[k].second << endl;
    // }
    for(int i = 0; i < 2*N; i++){
        for(int j = 0; j < 2*N; j++){
            P p = P(i, j);
            for(int k = 0; k < d2.size(); k++){
                int s = d2[k].first;
                int t = d2[k].second;
                for(int l = 0; l < 4; l++){
                    int x = i+dx[l]*s;
                    int y = j+dy[l]*t;
                    if(isInField(x, y)){
                        // cout << i << ' ' << j << ':' << x << ' ' << y << endl;
                        G2[i][j].push_back(P(x, y));
                    }
                }
            }
        }
    }
    for(int i = 0; i < 2*N; i++){
        for(int j = 0; j < 2*N; j++){
            if(!used1[i][j]){
                dfs1(P(i, j), 0);
            }
        }
    }
    for(int i = 0; i < 2*N; i++){
        for(int j = 0; j < 2*N; j++){
            if(!used2[i][j]){
                dfs2(P(i, j), 0);
            }
        }
    }
    // for(int i = 0; i <= 2*N; i++){
    //     for(int j = 0; j <= 2*N; j++){
    //         cout << col1[i][j];
    //     }
    //     cout << endl;
    // }
    // for(int i = 0; i <= 2*N; i++){
    //     for(int j = 0; j <= 2*N; j++){
    //         cout << col2[i][j];
    //     }
    //     cout << endl;
    // }

    for(int i = 0; i < 2*N; i++){
        for(int j = 0; j < 2*N; j++){
            int c1 = col1[i][j];
            int c2 = col2[i][j];
            cnt[c1][c2]++;
        }
    }
    int c1, c2;
    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 2; j++){
            if(cnt[i][j] >= N*N){
                c1 = i; c2 = j;
                break;
            }
        }
    }
    int cnt = 0;
    for(int i = 0; i < 2*N; i++){
        for(int j = 0; j < 2*N; j++){
            if(col1[i][j] == c1 && col2[i][j] == c2){
                cout << i << ' ' << j << endl;
                cnt++;
                if(cnt >= N*N) return 0;
            }
        }
    }
}

Measured memory_bytes: 179840