#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7;
long long l, r, n, m, k, q, w[N], v1[N], v2[N];
struct node {
  long long l, r;
} e[N];
inline long long divceil(long long a, long long b) {
  return (a / b) + ((a % b) > 0);
}
inline long long divfloor(long long a, long long b) { return (a / b); }
inline long long geta(long long v) {
  long long ans = 0;
  for (int i = 1; i <= m; i++) ans = ans + divceil(w[i], v);
  return ans;
}
inline long long getb(long long v) {
  long long ans = 0;
  for (int i = 1; i <= m; i++) ans = ans + divfloor(w[i], v);
  return ans;
}
inline bool cmp(node a, node b) { return a.r < b.r; }
int main() {
  int t;
  cin >> t;
  while (t--) {
    scanf("%lld%lld%lld", &n, &m, &k), q = 0;
    long long v = 0, c, s1 = 0, s2 = 0;
    for (int i = 1; i <= m; i++) scanf("%lld", &c), w[i] = c - v, v = c;
    w[m + 1] = n - v, m++;
    l = 1, r = n + 1;
    while (l <= r) {
      long long d = (l + r) >> 1;
      if (geta(d) <= m + k)
        s1 = d, r = d - 1;
      else
        l = d + 1;
    }
    l = 1, r = n + 1;
    while (l <= r) {
      long long d = (l + r) >> 1;
      if (getb(d) >= m + k)
        s2 = d, l = d + 1;
      else
        r = d - 1;
    }
    if (s1 <= s2) {
      putchar('0'), putchar('\n');
      continue;
    }
    q = 0;
    for (int i = 1; i <= m; i++)
      if (divceil(w[i], s1) > divfloor(w[i], s2)) {
        q++;
        e[q].l = divfloor(w[i], divceil(w[i], s1));
        if (divfloor(w[i], s2) == 0)
          e[q].r = 1e18;
        else
          e[q].r = divceil(w[i], divfloor(w[i], s2));
      }
    if (q == 0) {
      printf("%lld\n", s1 - s2);
      continue;
    }
    v1[0] = s1, v2[q + 1] = s2;
    sort(e + 1, e + q + 1, cmp);
    long long ans = 1e18;
    for (int i = 1; i <= q; i++) v1[i] = max(v1[i - 1], e[i].r);
    for (int i = q; i >= 1; i--) v2[i] = min(v2[i + 1], e[i].l);
    for (int i = 0; i <= q; i++) ans = min(ans, v1[i] - v2[i + 1]);
    printf("%lld\n", ans);
  }
}
