#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; auto range(int n) { return views::iota(0, n); } template ostream& operator<<(ostream& os, const pair& p){ return os << "{" << p.first << ", " << p.second << "}"; } template ostream& operator<<(ostream& os, const vector& obj) { os << "{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } template ostream& operator<<(ostream& os, const set& obj) { os << "set{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } template ostream& operator<<(ostream& os, const map& obj) { os << "map{"; for (const auto& e : obj) os << e << ", "; return os << "}"; } #ifdef ONLINE_JUDGE #define dump(expr) ; #else #define dump(expr) { cerr << "\033[33m#L" << __LINE__ << ": " << expr << "\033[39m" << endl; } #endif void jikken() { set> vis; queue> q; int n = 6; vector vs0(n); for (int i : range(n)) vs0[i] = i; q.push(vs0); while (!q.empty()) { auto vs = q.front(); q.pop(); if (vis.count(vs)) continue; vis.insert(vs); auto vs_o = vs; for (int k = 5; k <= n; ++k) { vs = vs_o; int x0 = vs[0]; for (int i : range(k - 1)) vs[i] = vs[i + 1]; vs[k - 1] = x0; q.push(vs); } } cout << vis.size() << endl; } ll solve() { int n; cin >> n; vector vs(n); for (int i : range(n)) cin >> vs[i]; bool ok0 = 1; for (int i : range(n - 1)) if (vs[i] > vs[i + 1]) ok0 = 0; if (ok0) return 0; vector down(n); down[n - 1] = 1; for (int i = n - 2; i >= 0; i--) { if (vs[i] > vs[i + 1]) break; down[i] = 1; } int hanten = 0; int pos = -1; for (int i : views::iota(1, n)) { if (vs[i - 1] > vs[i]) hanten++, pos = i; if (hanten >= 2) return 2; if (hanten == 1) { if (vs[0] >= vs[i]) { if (i == n - 1) return 1; if (vs[pos - 1] <= vs[i + 1] && down[i + 1]) return 1; } } } return 2; } int main() { cout << fixed << setprecision(12); // jikken(); cout << solve() << endl; }