#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; #define pb push_back #define mp make_pair #define F first #define S second const int N = (int)5e5 + 10; struct event { int x, l, r; event() {} event(int x, int l, int r) : x(x), l(l), r(r) {} }; vector<event> E[N]; int n, an, bn, p[N], posA[N], posB[N], mxA[N], mxB[N], add[4 * N]; pii a[N], b[N], ans[N], t[4 * N]; int get(pii *a, int r, int x, int decr) { int l = 0, res = r; while (l <= r) { int mid = (l + r) >> 1; if ((x < a[mid].F) ^ decr) res = mid, r = mid - 1; else l = mid + 1; } return res; } inline bool inversion(int i, int j) { return a[i].S < b[j].S && a[i].F > b[j].F; } void build(int v, int l, int r) { if (l == r) t[v] = mp(0, l); else { int mid = (l + r) >> 1; build(v+v,l,mid); build(v+v+1,mid+1,r); t[v] = max(t[v+v],t[v+v+1]); } } void push(int v) { if (v + v < 4 * N) add[v+v] += add[v]; if (v+v+1 < 4 * N) add[v+v+1] += add[v]; t[v].F += add[v]; add[v] = 0; } void update(int v, int l, int r, int L, int R, int x) { push(v); if (r < L || R < l) return; if (L <= l && r <= R) { add[v] += x; push(v); return; } int mid = (l + r) >> 1; update(v+v,l,mid,L,R,x); update(v+v+1,mid+1,r,L,R,x); t[v] = max(t[v+v], t[v+v+1]); } double fuck() { for (int i = 1; i <= n; i++) if (i != p[i]) for (int j = i + 1; j <= n; j++) if (p[i] > p[j]) { cout << i << " " << j << "\n"; exit(0); } return 0.0; } void show(int v, int l, int r, int tab=0) { for (int i= 0; i < tab; i++) putchar(' '); printf("[%d,%d] (%d,%d) +%d\n", l ,r, t[v].F, t[v].S, add[v]); if (l == r) return; int mid = (l + r) >> 1; show(v+v,l,mid,tab+1); show(v+v+1,mid+1,r,tab+1); } int main() { // freopen("a.in", "r", stdin); // freopen("a.out", "w", stdout); scanf("%d", &n); bool identity = true; for (int i = 1; i <= n; i++) scanf("%d", &p[i]), identity &= (p[i] == i); if (identity) { puts("Cool Array"); return 0; } mxA[0] = 0; mxB[n+1] = N; for (int i = 1, j = n; i <= n; i++, j--) { mxA[i] = max(mxA[i-1], p[i]); if (mxA[i] == p[i]) a[an++] = mp(p[i], i), posA[i] = an-1; else posA[i] = posA[i-1]; mxB[j] = min(mxB[j+1], p[j]); if (mxB[j] == p[j]) b[bn++] = mp(p[j], j), posB[j] = bn-1; else posB[j] = posB[j+1]; } for (int i = 1; i <= n; i++) { if (mxA[i] == p[i] || mxB[i] == p[i]) continue; int al = get(a, posA[i], p[i], 0); int ar = posA[i]; int bl = get(b, posB[i], p[i], 1); int br = posB[i]; // cerr << i << ' '<<p[i] << "|" << al << ' ' << ar << ' ' << bl << ' ' << br << "\n"; if (al > ar || bl > br) continue; E[al].pb(event(+2, bl, br)); if (ar + 1 < an) E[ar+1].pb(event(-2, bl, br)); } build(1,0,bn-1); // show(1,0,bn-1); int mx = 0; for (int i = 0; i < an; i++) { for (event &e : E[i]) update(1, 0, bn-1, e.l, e.r, e.x);//, show(1, 0, bn-1); push(1); ans[i] = t[1]; mx = max(mx, ans[i].F); } if (mx == 0) fuck(); else for (int i = 0; i < an; i++) if (ans[i].F == mx) { cout << a[i].S << ' ' << b[ans[i].S].S << "\n"; break; } return 0; }