func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1001;   const int M = 300000;   int n, m, a[N], b[N];   vector<bool> g[M];   pair<int, int> p[N];   priority_queue<pair<int, int> > q;   bool solve(int x) {     if (x == 0) return true;     for (int i = 1; i <= n; i++) b[i] = a[i] - x;     int sum = 0;     for (int i = 1; i <= n; i++) sum += b[i];     sort(b + 1, b + n + 1);     reverse(b + 1, b + n + 1);     if (sum & 1) {       b[1]--;       b[2]--;       b[3]--;     }     sort(b + 1, b + n + 1);     reverse(b + 1, b + n + 1);     if (b[n] < 0) return false;     for (int i = 1; i <= n; i++)       if (b[i] > 0) q.push(make_pair(b[i], i));     while (!q.empty()) {       pair<int, int> v = q.top();       q.pop();       if (q.empty()) return false;       pair<int, int> u = q.top();       q.pop();       v.first--;       u.first--;       if (v.first > 0) q.push(v);       if (u.first > 0) q.push(u);     }     return true;   }   void getSolution(int x) {     if (x == 0) {       m = 0;       for (int i = 1; i < n; i++) {         for (int j = 1; j <= 100; j++) {           m++;           for (int k = 1; k <= n; k++)             if (k == i || k == i + 1)               g[m][k - 1] = true;             else               g[m][k - 1] = false;         }       }       return;     }     for (int i = 1; i <= n; i++) b[i] = a[i] - x;     for (int i = 1; i <= n; i++)       if (b[i] > 0) q.push(make_pair(b[i], i));     int sum = 0;     for (int i = 1; i <= n; i++) sum += b[i];     int game = 0;     while (!q.empty()) {       game++;       if (sum & 1) {         pair<int, int> a = q.top();         q.pop();         if (q.empty()) assert(false);         pair<int, int> b = q.top();         q.pop();         if (q.empty()) assert(false);         pair<int, int> c = q.top();         q.pop();         for (int j = 1; j <= n; j++)           if (j == a.second || j == b.second || j == c.second)             g[game][j - 1] = true;           else             g[game][j - 1] = false;         a.first--;         b.first--;         c.first--;         if (a.first > 0) q.push(a);         if (b.first > 0) q.push(b);         if (c.first > 0) q.push(c);         sum -= 3;       } else {         pair<int, int> a = q.top();         q.pop();         if (q.empty()) assert(false);         pair<int, int> b = q.top();         q.pop();         for (int j = 1; j <= n; j++)           if (j == a.second || j == b.second)             g[game][j - 1] = true;           else             g[game][j - 1] = false;         a.first--;         b.first--;         if (a.first > 0) q.push(a);         if (b.first > 0) q.push(b);       }     }     m = game;   }   int main() {     cin >> n;     for (int i = 1; i <= n; i++) cin >> a[i];     int minval = a[1];     for (int i = 2; i <= n; i++) minval = min(minval, a[i]);     for (int i = 1; i <= 10000; i++) g[i].resize(n);     int ans = 0;     for (int i = minval; i >= 0; i--)       if (solve(i)) {         ans = i;         break;       }     cout << ans << endl;     getSolution(ans);     cout << m << endl;     for (int i = 1; i <= m; i++) {       for (int j = 0; j < g[i].size(); j++) cout << g[i][j];       cout << endl;     }     return 0;   }   