#include <bits/stdc++.h>   using namespace std;   template <class P, class Q>   ostream& operator<<(ostream& stream, pair<P, Q> v) {     stream <<  (  << v.first <<  ,  << v.second <<  ) ;     return stream;   }   template <class T>   ostream& operator<<(ostream& stream, const vector<T> v) {     stream <<  [  ;     for (int i = 0; i < (int)v.size(); i++) stream << v[i] <<    ;     stream <<  ] ;     return stream;   }   template <class T>   T smin(T& a, T b) {     if (a > b) a = b;     return a;   }   template <class T>   T smax(T& a, T b) {     if (a < b) a = b;     return a;   }   const long long M = 10004205361450474;   int ask(vector<long long> s) {     int sz = s.size();     cout << sz <<    ;     for (int i = 0; i < sz; ++i) cout << s[i] <<    n [i == sz - 1];     fflush(stdout);     int v = 0;     cin >> v;     if (v == -1) {       exit(0);     }     return v;   }   const int N = 1e4 + 5;   long long dp[N][6];   long long f(int A, int B) {     if (!B) return 0;     if (dp[A][B] != -1) return dp[A][B];     long long& ans = dp[A][B];     ans = 0;     const int W = A;     for (int i = 0; i < W; ++i) {       ans += f(A, B - 1) + 1;       A = min(10000ll, A + f(A, B - 1) + 1);     }     ans += f(A, B - 1);     return ans;   }   long long g(long long a, int b) { return f(min(10000ll, a), b); }   int main(void) {     memset(dp, -1, sizeof(dp));     const long long c1 = M - f(10000, 4);     const long long c2 = 2046;     const long long c3 = 6;     long long l, r;     int used = 5;     --used;     if (ask(vector<long long>{c1}) > 0) {       l = c1 + 1;       r = M;       goto shit;     }     --used;     if (ask(vector<long long>{c2}) > 0) {       l = c2 + 1;       r = c1 - 1;       goto shit;     }     --used;     if (ask(vector<long long>{c3}) > 0) {       l = c3 + 1;       r = c2 - 1;     } else {       l = 1;       r = c3 - 1;     }   shit:     for (int cs = used - 1; cs >= 0; --cs) {       vector<long long> s;       for (long long i = l; i + g(i, cs) <= r && s.size() < min(10000ll, l);            i += g(i, cs) + 1)         s.push_back(i + g(i, cs));       int v = ask(s);       if (!v) {         smin(r, s[0] - 1);       } else if (v == s.size()) {         smax(l, s.back() + 1);       } else {         smin(r, s[v] - 1);         smax(l, s[v - 1] + 1);       }     }     return 0;   }   