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
#include <iostream>
#include <utility>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

const int mxN = 3000;
vector<int> c[mxN];
pair<int, int> p[mxN];
pair<int, int> P[mxN];
bool byl[mxN];
int mx = 0, n;
vector<int> stack;
queue<int> q;
void czysc()
{
	for (int i = 0; i < n; i++)
		byl[i] = false;
	return;
}
int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		p[i] = { x, i };
		P[i] = { x, i };
	}
	sort(p, p + n);

	for (int i = 0; i < n; i++)
		P[p[i].second].second = i;
	/*int nr = 0;

	for (int i = 0; i < n; i++)
		if(!byl[i])
		{
			c[nr].push_back(i);
			byl[i] = true;
			int size = 1;
			int iZ = p[i].second;
			while (i != iZ)
			{
				c[nr].push_back(iZ);
				byl[iZ] = true;
				size++;
				iZ = p[iZ].second;
			}
			mx = max(size, mx);
			nr++;
		}
	if (mx == 1)
	{
		cout << 0;
		return 0;
	}
	
	cout << mx / 2 + mx % 2 << '\n';*/
	bool rob = true;
	int odp = 0;
	string s = "";
	while (rob)
	{
		czysc();
		rob = false;
		int ile = 0;
		for (int i = 0; i < n; i++)
			if (P[i].second != i && !byl[i] && !byl[P[i].second])
			{
				byl[i] = true;
				byl[P[i].second] = true;
				ile += 2;
				q.push(i);
				stack.push_back(P[i].second);
				rob = true;
				swap(P[i], P[P[i].second]);
			}

		if (ile == 0)
			break;
		odp++;
		s += to_string(ile);
		s += '\n';
		while (!q.empty())
		{
			s += to_string(q.front() + 1);
			s += ' ';
			q.pop();
		}
		while (!stack.empty())
		{
			s += to_string(stack.back() + 1);
			s += ' ';
			stack.pop_back();
		}
		s += '\n';
	}
	cout << odp << '\n' << s;

	return 0;

}