#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Hàm thực hiện đảo ngược đoạn đầu của mảng
void flip(vector<int>& arr, int k) {
reverse(arr.begin(), arr.begin() + k);
}
// Hàm tìm vị trí của giá trị target trong mảng
int find(const vector<int>& arr, int target) {
for (int i = 0; i < arr.size(); ++i) {
if (arr[i] == target) {
return i;
}
}
return -1; // Không tìm thấy (trường hợp này không xảy ra trong bài toán)
}
// Hàm thực hiện pancake sort
vector<int> pancakeSort(vector<int>& arr) {
vector<int> result;
// Bắt đầu từ giá trị lớn nhất và giảm dần
for (int valueToSort = arr.size(); valueToSort > 0; --valueToSort) {
// Tìm vị trí của giá trị lớn nhất hiện tại
int index = find(arr, valueToSort);
// Nếu giá trị đã ở đúng vị trí, bỏ qua
if (index == valueToSort - 1) {
continue;
}
// Đưa giá trị về đầu mảng nếu cần
if (index != 0) {
result.push_back(index + 1); // Lưu bước lật
flip(arr, index + 1); // Lật đoạn đầu mảng
}
// Đưa giá trị về đúng vị trí cuối mảng
result.push_back(valueToSort); // Lưu bước lật
flip(arr, valueToSort); // Lật đoạn chứa giá trị cần sắp xếp
}
return result;
}
// Hàm chính
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int& x : arr) {
cin >> x;
}
vector<int> result = pancakeSort(arr);
// In ra số bước lật
cout << "Number of flips: " << result.size() << endl;
// In ra các bước lật
for (int flipSize : result) {
cout << flipSize << " ";
}
cout << endl;
return 0;
}