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
//i:5 1670 2011 1560 1232 1447
//o:1
//i:6 1556 1449 1863 2014 1333 1220
//o:2
#include <bits/stdc++.h>
using namespace std;

int n;
pair<int, int> tab[3000];

bool odw[3000];
int cdfs(int i){
    odw[i] = true;
    if(!odw[tab[i].second]) return cdfs(tab[i].second) + 1;
    else return 1;
}

int cres = 0;

vector<vector<pair<int, int>>> res;

int t[3000];

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> tab[i].first;
        tab[i].second = i;
    }

    sort(tab, tab + n);
    
    for(int i = 0; i < n; i++) t[tab[i].second] = i;

    while(true){
        bool p = true;
        for(int i = 0; i < n; ++i) if(t[i] != i) p = false;
        if(p) break;

        fill(odw, odw + n, 0);
        vector<pair<int, int>> r;
        for(int j = 0; j < n; j++){
            if(t[j] == j || odw[j] || odw[t[j]]) continue;
            r.emplace_back(j+1, t[j]+1);
            odw[j] = true;
            odw[t[j]] = true;
            swap(t[j], t[t[j]]);
        }
        res.push_back(r);
    }

    cout << res.size() << endl;
    for(auto r : res){
        cout << r.size()*2 << endl;
        for(int i = 0; i < r.size(); i++) cout << r[i].first << " ";
        for(int i = r.size()-1; i >= 0; i--) cout << r[i].second << " ";
        cout << endl;
    }
}