#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
vector<int> g[N];
vector<pair<int, int> > ans;
int n, d, k, dp[N], curr;
bool vis[N];
int dfs(int v, int p = -1, int mx = -1) {
  vis[v] = true;
  if (v >= 1 && v <= d + 1) mx = max(mx, max(v - 1, d + 1 - v));
  while ((int)(g[v]).size() < k && curr <= n) {
    if (mx + 1 <= d) {
      ans.push_back({v, curr});
      g[v].push_back(curr);
      g[curr].push_back(v);
      ++curr;
      dp[v] = max(dp[v], 1 + dfs(curr - 1, v, max(dp[v] + 1, mx + 1)));
    } else {
      break;
    }
  }
  for (int u : g[v]) {
    if (vis[u]) continue;
    dfs(u, v, dp[v] + 1);
  }
  return dp[v];
}
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> d >> k;
  for (int i = 1; i < d + 1; i++) {
    g[i].push_back(i + 1);
    g[i + 1].push_back(i);
    ans.push_back({i, i + 1});
  }
  curr = d + 2;
  dfs(1);
  if (d > 1 && k < 2) curr = 1;
  if (curr == n + 1) {
    cout << "YES" << endl;
    for (auto x : ans) cout << x.first << ' ' << x.second << endl;
  } else {
    cout << "NO" << endl;
  }
  return 0;
}
