#include <bits/stdc++.h>   using namespace std;   const int INF = 0x3f3f3f3f;   const long long LINF = 0x3f3f3f3f3f3f3f3fll;   void bad() {     cout <<  NO  <<   n ;     exit(0);   }   const int MAX = 4e5 + 10;   vector<int> g[MAX];   int main() {     if (!false) ios_base::sync_with_stdio(0);     cin.tie(0);     int n, d, k;     cin >> n >> d >> k;     if (d >= n or (n > 2 and k == 1)) bad();     int nxt = 0;     vector<int> pos_dist(n, -1);     stack<int> can;     for (nxt = 0; nxt <= d; nxt++) {       if (nxt < d) {         g[nxt].push_back(nxt + 1);         g[nxt + 1].push_back(nxt);       }       pos_dist[nxt] = min(nxt, d - nxt);       can.push(nxt);     }     while (nxt < n) {       if (false) cout <<  g  <<   n ;       for (int i = 0; i < n; i++) {         if (false) cout << i <<  :  ;         for (auto j : g[i])           if (false) cout << j <<    ;         if (false) cout <<   n ;       }       if (false) cout <<   n ;       if (can.empty()) bad();       int v = can.top();       if (g[v].size() == k or pos_dist[v] == 0) {         can.pop();         continue;       }       g[v].push_back(nxt);       g[nxt].push_back(v);       pos_dist[nxt] = pos_dist[v] - 1;       can.push(nxt);       nxt++;     }     set<pair<int, int>> stans;     cout <<  YES  <<   n ;     for (int i = 0; i < n; i++) {       for (auto j : g[i]) stans.insert({min(i, j) + 1, max(i, j) + 1});     }     for (auto [x, y] : stans) cout << x <<     << y <<   n ;     return 0;   }   