#include <bits/stdc++.h> #ifdef getchar #undef getchar #endif #define getchar() (*_pinp?*_pinp++:(_inp[fread(_pinp=_inp, 1, 4096, stdin)]='\0', *_pinp++)) char _inp[4097], *_pinp=_inp; #define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x=(x<<3)+(x<<1)+_-'0');}while(0) char _; using namespace std; const int MAX=524288*23; int N; int A[500001]; int seg[MAX], lc[MAX], rc[MAX], n; int tree[500001]; int L[500001]; int R[500001]; int build(int begin, int end) { int root=++n; if(begin==end) lc[root]=rc[root]=0; else { int mid=(begin+end)/2; lc[root]=build(begin, mid); rc[root]=build(mid+1, end); } return root; } void copyover(int dst, int src) { seg[dst]=seg[src]; lc[dst]=lc[src]; rc[dst]=rc[src]; } void update(int& root, int begin, int end, int x, int v) { if(end<x || x<begin) return; int old=root; root=++n; if(old) copyover(root, old); if(begin==end) seg[root]++; else { int mid=(begin+end)/2; update(lc[root], begin, mid, x, v); update(rc[root], mid+1, end, x, v); seg[root]=seg[lc[root]]+seg[rc[root]]; } } int query(int root, int begin, int end, int l, int r) { if(!root || r<begin || end<l) return 0; if(l<=begin && end<=r) return seg[root]; int mid=(begin+end)/2; return query(lc[root], begin, mid, l, r)+ query(rc[root], mid+1, end, l, r); } int query(int x, int y, int l, int r) { return query(tree[y], 1, N, l, r)-query(tree[x-1], 1, N, l, r); } int ans=0, x=-1, y=-1; int relax(int l, int r) { if(l>=r || A[l]<A[r]) return -1; int v=query(l, r, A[r], A[l]); if(v>ans || (v==ans && (l<x || (l==x && r<y)))) ans=v, x=l, y=r; return v; } int main() { #if 1 scan(N); for(int i=1; i<=N; i++) scan(A[i]); #else N=5000; for(int i=1; i<=N; i++) A[i]=i; srand(time(NULL)); rotate(A+1, A+1+N/2, A+1+N); //random_shuffle(A+1, A+1+N); #endif tree[0]=build(1, N); for(int i=1; i<=N; i++) { tree[i]=tree[i-1]; update(tree[i], 1, N, A[i], 1); } bool cool=true; for(int i=2; i<=N; i++) cool&=A[i]==A[i-1]+1; if(cool) return printf("Cool Array\n"), 0; vector<int> S; for(int i=1; i<=N; i++) { while(!S.empty() && A[S.back()]>A[i]) S.pop_back(); if(S.empty()) L[i]=-1; else L[i]=S.back(); S.push_back(i); } S.clear(); for(int i=N; i>=1; i--) { while(!S.empty() && A[S.back()]<A[i]) S.pop_back(); if(S.empty()) R[i]=-1; else R[i]=S.back(); S.push_back(i); } vector<int> ls, rs; for(int i=1; i!=-1; i=R[i]) ls.push_back(i); for(int i=N; i!=-1; i=L[i]) rs.push_back(i); reverse(rs.begin(), rs.end()); bool exitearly=1LL*ls.size()*rs.size()>100000; for(auto& it: ls) { auto it2=upper_bound(rs.begin(), rs.end(), it); int maxiter=20; for(; it2!=rs.end(); ++it2) { if(A[it]<A[*it2]) break; relax(it, *it2); maxiter--; if(exitearly && maxiter==0) break; } } printf("%d %d\n", x, y); return 0; }