1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include<bits/stdc++.h>
using namespace std;

constexpr int N =3007;

vector<pair<int,int>> wzrost; // wzrost || id
int n,x;
int unssorted[N];
int wrong;
vector<vector<int>>wyn;
bool swapped[N];
int odw[N];

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
//    for(int i=100;i>0;i--)
//        cout << i << " ";
    cin >> n;
    for(int i=0; i<n; i++)
    {
       cin >> x;
        wzrost.push_back({x,i});
    }
    sort(wzrost.begin(),wzrost.end());
    for(int i=0; i<wzrost.size(); i++)
    {
        unssorted[wzrost[i].second]=i;
        odw[i]=wzrost[i].second;
        if(i!=wzrost[i].second)
            wrong++;
    }
              //  for(int i=0;i<n;i++)
    //    cout << odw[i] << " ";
    //cout << "\n\n";

//                for(int i=0; i<n; i++)
//        cout << unssorted[i] << " ";
    while(wrong)
    {
        for(int i=0;i<n;i++)
            swapped[i]=true;
        vector<int> g;
        g.clear();
        wyn.push_back(g);
        for(int i=0; i<n; i++)
        {

            if(unssorted[i]!=i)
            {
                if(swapped[i]&&swapped[unssorted[i]])
                {
                    swapped[i]=false;
                    swapped[unssorted[i]]=false;
                    wyn.back().push_back(unssorted[i]+1);
                    swap(odw[unssorted[i]],odw[unssorted[unssorted[i]]]);
                    swap(unssorted[i],unssorted[unssorted[i]]);

                g.push_back(i+1);
                wrong--;
                if(unssorted[i]==i)
                    wrong--;

                }

            }
        }
//            for(int i=0;i<n;i++)
//        cout << odw[i] << " ";
//    cout << "\n";
//        for(int i=0; i<n; i++)
//        cout << unssorted[i] << " ";
//        cout << "\n\n\n\ns";
        for(int i=0; i<n; i++)
        {
            if(unssorted[i]!=i)
            {
                if(i!=odw[odw[i]])
                {
                    if(swapped[i]&&swapped[odw[odw[i]]])
                {
                    //cout << i << " " << odw[odw[i]] << "\n";
                    swapped[i]=false;
                    swapped[odw[odw[i]]]=false;
                    int z = odw[odw[i]];
                    wyn.back().push_back(odw[odw[i]]+1);
                    swap(odw[unssorted[i]],odw[unssorted[odw[odw[i]]]]);
                    swap(unssorted[i],unssorted[z]);
                    g.push_back(i+1);
                }
                }

            }
            //cout << "\n\n";
        }
        //cout << "\n\n\n\n";

        for(int i=g.size()-1;i>=0;i--)
        {
            wyn.back().push_back(g[i]);
        }
      //  cout << wrong << " ";
//        cout << "\n\n\n";
//                for(int i=0; i<n; i++)
//        cout << unssorted[i] << " ";
//        cout << "\n\n\n";

    }
   // cout << "\n\n\n";
    cout << wyn.size() << "\n";
    for(auto x:wyn)
    {
        cout << x.size() << "\n";
        for(auto w:x)
        {
            cout << w << " ";
        }
        cout << "\n";
    }
    return 0;
}