#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;
}