func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize  trapv    long long int power(long long int x, long long int b) {     long long int p = 1;     while (b > 0) {       if (b & 1) {         p = p * x;         p %= 1000000007;       }       b >>= 1;       x *= x;       x %= 1000000007;     }     return p % 1000000007;   }   using namespace std;   struct ppp {     char a;     long long int b, c, d;   };   long long int N;   struct lex_compare {     bool operator()(ppp p1, ppp p2) {       if (p1.a == p2.a) {         if (p1.b == p2.b)           return p1.c < p2.c;         else           return p1.b < p2.b;       } else {         return p1.a < p2.a;       }     }   };   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     ;     long long int n;     cin >> n;     long long int arr[n];     for (long long int i = 0; i < n; i++) cin >> arr[i];     long long int maxt = n;     vector<vector<long long int> > ans;     while (maxt--) {       vector<vector<long long int> > blocks;       int i = 0;       while (i < n) {         long long int s = arr[i];         vector<long long int> temp;         temp.push_back(s);         i++;         while (i < n && arr[i] == s + 1) {           s = arr[i];           i++;           temp.push_back(s);         }         blocks.push_back(temp);       }       if (blocks.size() == 1) break;       long long int minele = blocks[blocks.size() - 1].back();       long long int next = minele + 1;       if (next == n + 1) {         vector<long long int> tempans;         long long int ind = 0;         for (int j = blocks.size() - 1; j >= 0; j--) {           tempans.push_back(blocks[j].size());           for (auto k : blocks[j]) {             arr[ind++] = k;           }         }         reverse(tempans.begin(), tempans.end());         ans.push_back(tempans);         continue;       }       long long int ind2nd = 0;       while (ind2nd < blocks.size() && blocks[ind2nd][0] != next) {         ind2nd++;       }       vector<long long int> tempans;       long long int size1 = 0;       i = 0;       while (i < ind2nd) {         size1 += blocks[i].size();         i++;       }       if (size1 != 0) tempans.push_back(size1);       size1 = 0;       i = ind2nd;       while (i < blocks.size() - 1) {         size1 += blocks[i].size();         i++;       }       if (size1 != 0) tempans.push_back(size1);       tempans.push_back(blocks.back().size());       ans.push_back(tempans);       int ind = 0;       for (auto j : blocks.back()) {         arr[ind++] = j;       }       for (int j = ind2nd; j < blocks.size() - 1; j++) {         for (auto k : blocks[j]) {           arr[ind++] = k;         }       }       for (int j = 0; j < ind2nd; j++) {         for (auto k : blocks[j]) {           arr[ind++] = k;         }       }     }     cout << ans.size() <<   n ;     for (auto i : ans) {       cout << i.size() <<    ;       for (auto j : i) cout << j <<    ;       cout <<   n ;     }     return 0;   }   