#include <bits/stdc++.h> #include <ext/hash_map> #include <ext/numeric> using namespace std; using namespace __gnu_cxx; #define REP(i,n) for( (i)=0 ; (i)<(n) ; (i)++ ) #define rep(i,x,n) for( (i)=(x) ; (i)<(n) ; (i)++ ) #define REV(i,n) for( (i)=(n) ; (i)>=0 ; (i)-- ) #define FORIT(it,x) for( (it)=(x).begin() ; (it)!=(x).end() ; (it)++ ) #define foreach(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();++it) #define rforeach(it,c) for(__typeof((c).rbegin()) it=(c).rbegin();it!=(c).rend();++it) #define foreach2d(i, j, v) foreach(i,v) foreach(j,*i) #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define SZ(x) ((int)(x).size()) #define MMS(x,n) memset(x,n,sizeof(x)) #define mms(x,n,s) memset(x,n,sizeof(x)*s) #define pb push_back #define mp make_pair #define NX next_permutation #define UN(x) sort(all(x)),x.erase(unique(all(x)),x.end()) #define CV(x,n) count(all(x),(n)) #define FIND(x,n) find(all(x),(n))-(x).begin() #define ACC(x) accumulate(all(x),0) #define PPC(x) __builtin_popcount(x) #define LZ(x) __builtin_clz(x) #define TZ(x) __builtin_ctz(x) #define mxe(x) *max_element(all(x)) #define mne(x) *min_element(all(x)) #define low(x,i) lower_bound(all(x),i) #define upp(x,i) upper_bound(all(x),i) #define NXPOW2(x) (1ll << ((int)log2(x)+1)) #define PR(x) cout << #x << " = " << (x) << endl ; typedef unsigned long long ull; typedef long long ll; typedef vector<int> vi; typedef vector<vector<int> > vvi; typedef pair<int, int> pii; const int OO = (int) 2e9; const double eps = 1e-9; const int N = 500005; int n; int arr[N]; int R[N]; int len[N]; int f[N]; int cnt[N]; int bit[N]; bool vis[N]; void update(int idx, int val) { for (int l = idx + 1; l <= n; l += l & -l) bit[l] += val; } int query(int idx) { int ret = 0; for (int l = idx + 1; l > 0; l -= l & -l) ret += bit[l]; return ret; } pair<int, int> mergeSortArr[N]; void mergeSort(int s, int e) { if (s == e) { mergeSortArr[s] = make_pair(s, arr[s]); return; } int mid = (s + e) / 2; mergeSort(s, mid); mergeSort(mid + 1, e); vector<pair<int, int> > res; for (int i = s, j = mid + 1, k = 0; k < e - s + 1; ++k) if (i == mid + 1) { res.push_back(mergeSortArr[j]); ++j; } else if (j == e + 1) { res.push_back(mergeSortArr[i]); cnt[mergeSortArr[i].first] += j - (mid + 1); ++i; } else if (mergeSortArr[i].second < mergeSortArr[j].second) { res.push_back(mergeSortArr[i]); cnt[mergeSortArr[i].first] += j - (mid + 1); ++i; } else { res.push_back(mergeSortArr[j]); ++j; } for (int i = 0; i < e - s + 1; ++i) mergeSortArr[s + i] = res[i]; } void init() { mergeSort(0, n - 1); } int calcInv(int st, int en) { int res = 0; if (arr[st] < arr[en]) res++; else res--; for (int i = 0; i < n; i++) { res += cnt[i]; if (st < i && i < en) { if (arr[st] < arr[i] && arr[i] < arr[en]) res += 2; else if (arr[st] > arr[i] && arr[i] > arr[en]) res -= 2; } } return res; } int LIS() { MMS(len, 0x3f); for (int i = 0; i < n; i++) R[n - 1 - i] = arr[i]; len[0] = -1e9; int mx = 0; for (int i = 0; i < n; i++) { f[i] = lower_bound(len + 1, len + n + 1, R[i]) - len; mx = max(mx, f[i]); len[f[i]] = R[i]; } return mx; } bool isSorted() { for (int i = 0; i < n; i++) if (arr[i] != i + 1) return 0; return 1; } int mx, x, y; void eval(int i) { memset(bit, 0, sizeof bit); mx = 0, x = 1e9, y = 1e9; for (int j = i + 1; j < n; ++j) { if (arr[i] > arr[j]) { vis[j] = 1; int cur = query(arr[i] - 1) - query(arr[j]); int ret = 2 * cur + 1; if (mx < ret) mx = ret, x = i, y = j; update(arr[j], 1); } } } int main() { std::ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n; for (int i = 0; i < n; i++) cin >> arr[i]; if (isSorted()) { cout << "Cool Array\n"; return 0; } int mmx = 0, xx = 1e9, yy = 1e9; int cnt = 0; for (int i = 0; i < n; ++i) { if (vis[i]) continue; int k = i; while (k + 1 < n && arr[k] < arr[k + 1]) ++k; int lst = k; cnt += n - k, eval(k); if (mmx < mx) { mmx = mx; while (i < k) { int md = (i + k) / 2; cnt += n - md, eval(md); if (mx == mmx) k = md; else i = md + 1; } eval(k); xx = x, yy = y; } i = lst; if (cnt >= 1e8) { cnt = -1; break; } } if (cnt != -1) cout << xx + 1 << " " << yy + 1 << endl; else { init(); int res = LIS(); int en, tmp = res; vector<int> st; for (int i = n - 1; i >= 0; i--) { if (f[i] == tmp) tmp--; if (f[i] == res) { st.pb(n - 1 - i); } else if (f[i] == 1 && tmp < 2) { en = n - 1 - i; break; } } int l = 0, r = SZ(st) - 1; while (l < r) { int mid = (l + r) / 2; if (calcInv(st[mid + 1], en) < calcInv(st[mid], en)) l = mid + 1; else r = mid; } cout << st[l] + 1 << " " << en + 1 << endl; } return 0; }