// {{{ by shik #include <bits/stdc++.h> #include <unistd.h> #define SZ(x) ((int)(x).size()) #define ALL(x) begin(x),end(x) #define REP(i,n) for ( int i=0; i<int(n); i++ ) #define REP1(i,a,b) for ( int i=(a); i<=int(b); i++ ) #define FOR(it,c) for ( auto it=(c).begin(); it!=(c).end(); it++ ) #define MP make_pair #define PB push_back using namespace std; typedef long long LL; typedef pair<int,int> PII; typedef vector<int> VI; #ifdef SHIK template<typename T> void _dump( const char* s, T&& head ) { cerr<<s<<"="<<head<<endl; } template<typename T, typename... Args> void _dump( const char* s, T&& head, Args&&... tail ) { int c=0; while ( *s!=',' || c!=0 ) { if ( *s=='(' || *s=='[' || *s=='{' ) c++; if ( *s==')' || *s==']' || *s=='}' ) c--; cerr<<*s++; } cerr<<"="<<head<<", "; _dump(s+1,tail...); } #define dump(...) do { \ fprintf(stderr, "%s:%d - ", __PRETTY_FUNCTION__, __LINE__); \ _dump(#__VA_ARGS__, __VA_ARGS__); \ } while (0); template<typename Iter> ostream& _out( ostream &s, Iter b, Iter e ) { s<<"["; for ( auto it=b; it!=e; it++ ) s<<(it==b?"":" ")<<*it; s<<"]"; return s; } template<typename A, typename B> ostream& operator <<( ostream &s, const pair<A,B> &p ) { return s<<"("<<p.first<<","<<p.second<<")"; } template<typename T> ostream& operator <<( ostream &s, const vector<T> &c ) { return _out(s,ALL(c)); } template<typename T> ostream& operator <<( ostream &s, const set<T> &c ) { return _out(s,ALL(c)); } template<typename A, typename B> ostream& operator <<( ostream &s, const map<A,B> &c ) { return _out(s,ALL(c)); } #else #define dump(...) #endif void RI() {} template<typename... T> void RI( int& head, T&... tail ) { scanf("%d",&head); RI(tail...); } // }}} const int MXN = 500010; struct seg_t { static seg_t mem[MXN * 4], *pmem; int l, r, val, mx, mxi; seg_t *lch, *rch; seg_t() {} seg_t(int nl, int nr): l(nl), r(nr) { val = mx = 0; mxi = nl; lch = rch = NULL; if (l != r) { int m = (l + r) / 2; lch = new (pmem++) seg_t(l, m); rch = new (pmem++) seg_t(m + 1, r); } } void update(int ql, int qr, int add) { if (l < ql || r > qr) { int m = (l + r) / 2; if (ql <= m) lch->update(ql, qr, add); if (qr > m) rch->update(ql, qr, add); if (lch->mx >= rch->mx) { mx = lch->mx + val; mxi = lch->mxi; } else { mx = rch->mx + val; mxi = rch->mxi; } } else { val += add; mx += add; } } } seg_t::mem[MXN * 4], *seg_t::pmem; int num[MXN], segl[MXN], segr[MXN]; int main() { int n; scanf("%d", &n); bool able = false; vector<int> cands, candsi; for(int i = 0; i < n; i++) { scanf("%d" ,&num[i]); if (i > 0 && num[i - 1] > num[i]) able = true; segl[i] = lower_bound(cands.begin(), cands.end(), num[i]) - cands.begin(); segr[i] = cands.size(); if (cands.empty() || cands.back() < num[i]) { cands.push_back(num[i]); candsi.push_back(i); } } if (!able) { puts("Cool Array"); return 0; } seg_t::pmem = seg_t::mem; seg_t root(0, (int)cands.size() - 1); vector< pair<int, int> > vec; for (int i = 0; i < n; i++) vec.push_back(make_pair(num[i], i)); sort(vec.begin(), vec.end()); int ans = -1, sl = -1, sr = -1; for (int i = n - 1, j = n - 1, lst = MXN; i > 0; i--) { if (segl[i] < segr[i]) root.update(segl[i], segr[i] - 1, -1); if (num[i] >= lst) continue; lst = num[i]; while(j >= 0 && vec[j].first >= num[i]) { int idx = vec[j--].second; if (segl[idx] < segr[idx]) root.update(segl[idx], segr[idx] - 1, 1); } if (segl[i] == segr[i]) continue; int nsl = candsi[max(segl[i], root.mxi)], nsr = i; dump(root.mx, nsl, nsr); if (root.mx > ans || (root.mx == ans && make_pair(nsl, nsr) < make_pair(sl, sr))) { tie(ans, sl, sr) = make_tuple(root.mx, nsl, nsr); } } // fprintf(stderr, "%d\n" ,ans); printf("%d %d\n", sl + 1, sr + 1); return 0; }