#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool ckmin(T &a, const T &b) {
  return b < a ? a = b, 1 : 0;
}
template <typename T>
inline bool ckmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
const int inf = 1e9;
map<pair<int, int>, int> vis, used, str;
set<pair<int, int> > crd;
int n;
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1}, dy[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int check(vector<pair<int, int> > cd) {
  used.clear(), str.clear();
  for (int i = (0), _x = ((int)(cd).size() - 1); i <= _x; i++) str[cd[i]] = 1;
  vis.clear(), crd.clear();
  for (int i = (0), _x = ((int)(cd).size() - 1); i <= _x; i++)
    vis[cd[i]] = 4, crd.insert(cd[i]);
  int ans = 0;
  int mnx = inf, mxx = -inf, mxy = -inf, mny = inf;
  while (!crd.empty()) {
    pair<int, int> u = *crd.begin();
    used[u] = 1;
    ckmin(mnx, u.first), ckmin(mny, u.second), ckmax(mxx, u.first),
        ckmax(mxy, u.second);
    ans++;
    vis[u] = -inf;
    crd.erase(crd.begin());
    for (int i = 0; i < 8; i++) {
      pair<int, int> v = u;
      v.first += dx[i], v.second += dy[i];
      vis[v]++;
      if (vis[v] >= 4) crd.insert(v);
    }
  }
  return ans;
}
vector<pair<int, int> > corn(int n) {
  vector<pair<int, int> > id;
  for (int i = (1), _x = (n / 2); i <= _x; i++) id.push_back(make_pair(i, 0));
  n -= n / 2;
  for (int i = (1), _x = (n); i <= _x; i++) id.push_back(make_pair(i, 1));
  return id;
}
vector<pair<int, int> > test(int h) {
  vector<pair<int, int> > id;
  id.clear();
  int m = h / 2;
  for (int i = (1), _x = (m); i <= _x; i++) id.push_back(make_pair(i, 0));
  for (int i = (1), _x = (h - m); i <= _x; i++) id.push_back(make_pair(i, 1));
  int k = n - h, mdr = (m + 1) / 2, mdl = (h - m + 1) / 2;
  int R = m / 4 - (m % 4 == 0), L = (h - m) / 4 - ((h - m) % 4 == 0);
  if (k / 2 > 1) {
    for (int i = (-R - k / 2), _x = (-R - 1); i <= _x; i++)
      id.push_back(make_pair(mdr, i));
    k -= k / 2;
  }
  for (int i = (L + 2), _x = (L + k + 1); i <= _x; i++)
    id.push_back(make_pair(mdl, i));
  return id;
}
void quit(vector<pair<int, int> > id) {
  assert((int)(id).size() == n);
  assert(check(id) >= n * n / 10);
  for (int i = (0), _x = ((int)(id).size() - 1); i <= _x; i++)
    printf("%d %d\n", id[i].first, id[i].second);
  exit(0);
}
int main() {
  scanf("%d", &n);
  vector<pair<int, int> > id;
  if (n <= 14) quit(corn(n));
  if (n <= 50) {
    int mx = 0;
    vector<pair<int, int> > id;
    for (int i = (1), _x = (n); i <= _x; i++) {
      vector<pair<int, int> > tmp = test(i);
      int t = check(tmp);
      if (t > mx) mx = t, id = tmp;
    }
    quit(id);
  }
  int m = n * 4 / 5;
  quit(test(m));
  return 0;
}
