#include <bits/stdc++.h> #define MAXN 500005 #define L(node) (node << 1) #define R(node) ((L(node)) + 1) using namespace std; int a[MAXN]; set<int> s; pair<int, int> tree[MAXN * 4]; int lazy[MAXN * 4]; int pos[MAXN]; int treee[MAXN * 4]; void propagate(int node, int left, int right) { tree[node].first += lazy[node]; if (left != right) { lazy[L(node)] += lazy[node]; lazy[R(node)] += lazy[node]; } lazy[node] = 0; } void update(int x, int y, int val, int node, int left, int right) { if (y < x) return; propagate(node, left, right); if (y < left || right < x) return; if (x <= left && right <= y) { lazy[node] = val; propagate(node, left, right); return; } int mid = (left + right) >> 1; update(x, y, val, L(node), left, mid); update(x, y, val, R(node), mid + 1, right); tree[node] = max(tree[L(node)], tree[R(node)]); } pair<int, int> getMax(int x, int y, int node, int left, int right) { if (y < x) return make_pair(-1000000, -1000000); propagate(node, left, right); if (y < left || right < x) return make_pair(-1000000, -1000000); if (x <= left && right <= y) { return tree[node]; } int mid = (left + right) >> 1; return max(getMax(x, y, L(node), left, mid), getMax(x, y, R(node), mid + 1, right)); } void init(int node, int left, int right) { tree[node] = make_pair(0, -left); if (left == right) return; int mid = (left + right) >> 1; init(L(node), left, mid); init(R(node), mid + 1, right); } int maxLeft[MAXN], minRight[MAXN]; int globalMinRight[MAXN]; vector<int> good; pair<int, int> get(int ind) { int start = -1; int end = good.size(); while (end - start > 1) { int mid = (end + start) >> 1; if (good[mid] <= ind) start = mid; else end = mid; } int low = end; int high = good.size(); if (low == int(good.size()) || a[good[low]] >= a[ind]) return make_pair(good.size(), good.size()); while (high - low > 1) { int mid = (high + low) / 2; if (a[good[mid]] < a[ind]) low = mid; else high = mid; } if (low == int(good.size()) || a[good[low]] >= a[ind]) return make_pair(good.size(), good.size()); return make_pair(end, low); } int main() { ios::sync_with_stdio(0); // freopen("/home/ahmed/testing.in", "r", stdin); int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &a[i]); a[i]--; pos[a[i]] = i; } init(1, 0, n - 1); for (int i = 0; i < n; i++) { int j = i - 1; while (j >= 0 && a[j] < a[i]) j = maxLeft[j]; maxLeft[i] = j; } for (int i = n - 1; i >= 0; i--) { int j = i + 1; while (j < n && a[j] > a[i]) j = minRight[j]; minRight[i] = j; if (minRight[i] == n) good.push_back(i); } reverse(good.begin(), good.end()); int ind = n - 1; int ii = -1, jj = -1, ans = -1; priority_queue<int> pq; for (int i = n - 1; i >= 0; i--) { pair<int, int> p = get(i); if (p.first < int(good.size())) { // cout << a[i] + 1 << " " << good[p.first] << " " << good[p.second] << endl; update(good[p.first], good[p.second], 1, 1, 0, n - 1); } pq.push(a[i]); if (maxLeft[i] != -1) continue; int x = i; while(ind > x) { if (minRight[ind] == n) update(ind, ind, 10000000, 1, 0, n - 1); ind--; } while (!pq.empty()) { int x = pq.top(); if (x < a[i]) break; pq.pop(); pair<int, int> p = get(pos[x]); if (p.first < int(good.size())) update(good[p.first], good[p.second], -1, 1, 0, n - 1); } pair<int, int> tmp = getMax(i + 1, n - 1, 1, 0, n - 1); int val = tmp.first - 10000000; int index = -tmp.second; if (index < 0 || index > n || a[i] < a[index]) continue; int L = i, R = index; if (val > ans) ans = val, ii = L, jj = R; else if (val == ans && L < ii) ans = val, ii = L, jj = R; else if (val == ans && L == ii && R < jj) ans = val, ii = L, jj = R; } if (ans == -1) cout << "Cool Array" << endl; else cout << ii + 1 << " " << jj + 1 << endl; return 0; }