```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n, d, k int
fmt.Fscan(in, &n, &d, &k)
if n == 1 {
if d == 0 {
fmt.Fprintln(out, "YES")
} else {
fmt.Fprintln(out, "NO")
}
return
}
if d == 0 || d >= n {
fmt.Fprintln(out, "NO")
return
}
if k == 1 {
if n == 2 && d == 1 {
fmt.Fprintln(out, "YES")
fmt.Fprintln(out, 1, 2)
} else {
fmt.Fprintln(out, "NO")
}
return
}
if k == 2 {
if n == d+1 {
fmt.Fprintln(out, "YES")
for i := 1; i < n; i++ {
fmt.Fprintln(out, i, i+1)
}
} else {
fmt.Fprintln(out, "NO")
}
return
}
need := n - (d + 1)
if int64(need) > int64(d-1)*int64(k-2) {
fmt.Fprintln(out, "NO")
return
}
fmt.Fprintln(out, "YES")
for i := 1; i <= d; i++ {
fmt.Fprintln(out, i, i+1)
}
cur := d + 2
for i := 2; i <= d && cur <= n; i++ {
for j := 0; j < k-2 && cur <= n; j++ {
fmt.Fprintln(out, i, cur)
cur++
}
}
}
```