func_code_string: #include <bits/stdc++.h>   using namespace std;   long long int d[400001], num[400001];   int decr[400001], inc[400001];   priority_queue<pair<long long int, int>, vector<pair<long long int, int> >,                  greater<pair<long long int, int> > >       H1;   priority_queue<pair<long long int, int> > H2;   int main() {     int i;     int t, m;     long long int n, k, p, o;     scanf( %d , &t);     while (t--) {       scanf( %I64d %d %I64d , &n, &m, &k), o = 0;       for (i = 0; i < m; i++) scanf( %I64d , &p), d[i] = p - o, o = p;       d[m++] = n - o, k += m;       long long int l = 1, r = n;       while (l < r) {         long long int mid = (l + r) / 2;         long long int s = 0;         for (i = 0; i < m; i++) s += (d[i] + mid - 1) / mid;         if (s > k)           l = mid + 1;         else           r = mid;       }       long long int s = 0;       for (i = 0; i < m; i++) num[i] = (d[i] + r - 1) / r, s += num[i];       for (i = 0; i < m; i++) {         if ((s < k) && ((d[i] + num[i] - 1) / num[i] == r)) {           long long int x = (d[i] - 1) / (r - 1) - num[i] + 1;           x = min(x, k - s);           num[i] += x, s += x;         }         l = min(l, d[i] / num[i]);       }       long long int ans = r - l;       for (i = 0; i < m; i++)         H1.push(make_pair(d[i] / num[i], i)),             H2.push(make_pair(d[i] / (num[i] + 1), i));       fill(decr, decr + m, 0), fill(inc, inc + m, 0);       int tt = 10 * m;       while (tt--) {         while (d[H1.top().second] / num[H1.top().second] != H1.top().first)           H1.pop();         while (d[H2.top().second] / (num[H2.top().second] + 1) != H2.top().first)           H2.pop();         int u = H1.top().second, v = H2.top().second;         H1.pop(), H2.pop();         if (u == v) break;         num[u]--, num[v]++;         decr[u] = 1, inc[v] = 1;         if (decr[u] && inc[u]) break;         if (decr[v] && inc[v]) break;         if (num[u] == 0) break;         r = max(r, (d[u] + num[u] - 1) / num[u]);         H1.push(make_pair(d[u] / num[u], u));         if (d[u] / num[u] != d[u] / (num[u] + 1))           H2.push(make_pair(d[u] / (num[u] + 1), u));         if (d[v] / num[v] != d[v] / (num[v] - 1))           H1.push(make_pair(d[v] / num[v], v));         H2.push(make_pair(d[v] / (num[v] + 1), v));         while (d[H1.top().second] / num[H1.top().second] != H1.top().first)           H1.pop();         ans = min(ans, r - H1.top().first);       }       printf( %I64d n , ans);       while (!H1.empty()) H1.pop();       while (!H2.empty()) H2.pop();     }     return 0;   }   