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
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=3009;
int t[N];
int t2[N];
int t3[N];
bool vis[N];
vector<int>v1,v2;
vector<int>g[N];

bool cmp(int a, int b){
    return t[a]<t[b];
}

void dfs(int x){
    vis[x]=true;
    int v=t3[x];
    while(!vis[v]){
        vis[v]=true;
        g[x].push_back(v);
        v=t3[v];
    }
}

int main(){

    int n;
    cin>>n;
    for(int i=0;i<n;i++) {
        cin>>t[i];
        t2[i]=i;
    }
    sort(t2,t2+n,cmp);

 //   cout<<"tablica t2\n";
   // for(int i=0;i<n;i++) cout<<t2[i]<<" "; cout<<"\n";

    for(int i=0;i<n;i++) t3[t2[i]]=i;
  //  for(int i=0;i<n;i++) cout<<t3[i]<<" "; cout<<"\n";

    int ile=0;
    for(int i=0;i<n;i++){
        g[i].push_back(i);
        if(!vis[i]){
            dfs(i);
            ile=max(ile,(int)g[i].size());
        }
    }


   // cout<<"nd wektor: "<<ile<<"\n";
/*
    for(int i=0;i<n;i++){
        cout<<i<<":";
        for(int j=0;j<g[i].size();j++) cout<<g[i][j]<<" "; cout<<"\n";
    } */
    if(ile==1){
        cout<<0<<"\n";
    }
    else{
        int licznik=0;
        bool pom=false;
        while(ile>1){
            if(ile%2==1) pom=true;
            ile/=2; licznik++;
        }
        if(pom) licznik++;
        cout<<licznik<<"\n";
        int krok=1;
        int skok=2;
        for(int i=0;i<licznik;i++){
            for(int j=0;j<n;j++){
                if(g[j].size()>1){
                    for(int x=0;x+krok<g[j].size();x+=skok){
                        v1.push_back(g[j][x]+1);
                        v2.push_back(g[j][x+krok]+1);
                    }
                }
            }
            cout<<v1.size()+v2.size()<<"\n";
            for(int k=0;k<v1.size();k++) cout<<v1[k]<<" ";
            for(int k=v2.size()-1;k>=0;k--) cout<<v2[k]<<" "; cout<<"\n";
            v1.clear();
            v2.clear();
            krok*=2;
            skok*=2;
        }
    }
}