#include <bits/stdc++.h> #define pii pair<int, int> #define mp make_pair #define pb push_back #define f first #define s second using namespace std; typedef long long ll; typedef long double ld; const int MAXN = (int) 7e6 + 7; const int INF = (int) 1e9 + 7; int n; vector<int> a; int ans = -1; int ansL = -1; int ansR = -1; pii t[MAXN]; int d[MAXN]; void build(int v, int l, int r) { t[v] = mp(0, l); d[v] = 0; if (l == r) { return; } int m = (l + r) / 2; build(v * 2, l, m); build(v * 2 + 1, m + 1, r); } void push(int v) { if (d[v] != 0) { t[v].f += d[v]; d[v * 2] += d[v]; d[v * 2 + 1] += d[v]; d[v] = 0; } } void add(int v, int l, int r, int l1, int r1, int val) { push(v); if (l == l1 && r == r1) { d[v] += val; push(v); return; } int m = (l + r) / 2; if (l1 <= m) { add(v * 2, l, m, l1, min(r1, m), val); } else { push(v * 2); } if (r1 > m) { add(v * 2 + 1, m + 1, r, max(l1, m + 1), r1, val); } else { push(v * 2 + 1); } if (t[v * 2].f > t[v * 2 + 1].f) t[v] = t[v * 2]; else if (t[v * 2].f < t[v * 2 + 1].f) t[v] = t[v * 2 + 1]; else { if (t[v * 2].s < t[v * 2 + 1].s) t[v] = t[v * 2]; else t[v] = t[v * 2 + 1]; } } int main() { #ifdef LOCAL freopen("in", "r", stdin); #endif scanf("%d", &n); a.resize(n); vector<int> pref(n); vector<int> suff(n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); a[i]--; } for (int i = 0; i < n - 1; i++) { if (a[i] > a[i + 1]) { ans = 0; ansL = i + 1; ansR = i + 2; } } if (ans == -1) { puts("Cool Array"); return 0; } vector<int> l, r, lv, rv; for (int i = 0; i < n; i++) { pref[i] = max(i == 0 ? 0 : pref[i - 1], a[i]); } for (int i = n - 1; i >= 0; i--) { suff[i] = min(i == n - 1 ? n : suff[i + 1], a[i]); } for (int i = 0; i < n; i++) { if (a[i] == pref[i]) { l.pb(i); lv.pb(a[i]); } if (a[i] == suff[i]) { r.pb(i); rv.pb(a[i]); } } vector<vector<pii>> st((int) l.size()); vector<vector<pii>> en((int) l.size()); for (int i = 0; i < n; i++) { //if (a[i] == pref[i] || a[i] == suff[i]) { // continue; //} int r1 = lower_bound(r.begin(), r.end(), i) - r.begin(); int r2 = lower_bound(rv.begin(), rv.end(), a[i]) - rv.begin() - 1; if (r1 > r2) continue; int l1 = lower_bound(lv.begin(), lv.end(), a[i]) - lv.begin(); int l2 = lower_bound(l.begin(), l.end(), i) - l.begin() - 1; if (l1 > l2) continue; st[l1].pb(mp(r1, r2)); en[l2].pb(mp(r1, r2)); } int cnt = 0; build(1, 0, (int) r.size() - 1); for (int i = 0; i < l.size(); i++) { for (int j = 0; j < st[i].size(); j++) { cnt++; add(1, 0, (int) r.size() - 1, st[i][j].f, st[i][j].s, 1); } if (t[1].f > ans) { ans = t[1].f; ansL = l[i] + 1; ansR = r[t[1].s] + 1; } else if (t[1].f == ans && mp(ansL, ansR) > mp(l[i] + 1, r[t[1].s] + 1)) { ansL = l[i] + 1; ansR = r[t[1].s] + 1; } for (int j = 0; j < en[i].size(); j++) { cnt--; add(1, 0, (int) r.size() - 1, en[i][j].f, en[i][j].s, -1); } } cout << ansL << " " << ansR << endl; return 0; }