#include <bits/stdc++.h> #define rf freopen("inp.in","r",stdin) #define F first #define S second #define PII pair<int,int> #define MAX 500005 using namespace std; inline int scan(){ int x = 0; char c = getchar(); while(c < '0' || c > '9'){ c = getchar(); } while(c >= '0' && c <= '9'){ x = x * 10 + c - '0'; c = getchar(); } return x; } int N , ARR[MAX]; //Persistent Segment Tree Template :: Anudeep struct node{ int SUM; node* LEFT_CHILD; node* RIGHT_CHILD; node(int _SUM , node* _LEFT_CHILD , node* _RIGHT_CHILD){ SUM = _SUM; LEFT_CHILD = _LEFT_CHILD; RIGHT_CHILD = _RIGHT_CHILD; } node(){ SUM = 0; LEFT_CHILD = NULL; RIGHT_CHILD = NULL; } node* upd(int l , int r , int val); }; node* null; node* ROOT[MAX]; node* node::upd(int l , int r , int val){ if(l == r) return new node(1 , null , null); int mid = (l + r)/2; if(val <= mid) return new node(SUM + 1 , LEFT_CHILD -> upd(l , mid , val) , RIGHT_CHILD); else return new node(SUM + 1 , LEFT_CHILD , RIGHT_CHILD -> upd(mid + 1 , r , val)); } void upd(int pos , int val){ ROOT[pos] = ROOT[pos + 1] -> upd(1 , N , val); } int less_query(int qs , int qe , int val){ int SUM = 0; int l = 1 , r = N; node* ll = ROOT[qs]; node* rr = ROOT[qe + 1]; while(l < r){ int mid = l + r >> 1; if(val <= mid){ r = mid; ll = ll -> LEFT_CHILD; rr = rr -> LEFT_CHILD; } else{ SUM += ll -> LEFT_CHILD -> SUM - rr -> LEFT_CHILD -> SUM; l = mid + 1; ll = ll -> RIGHT_CHILD; rr = rr -> RIGHT_CHILD; } } return SUM; } int MIS[MAX]; // Each suffix of minimum elements bool OK = 1; int IDX1 = -1 , IDX2 = -1 , ANS = 0; int main(){ //rf; null = new node(); null -> LEFT_CHILD = null -> RIGHT_CHILD = null; N = scan(); ROOT[N + 1] = null; for(int i = 1 ; i <= N ; ++i) ARR[i] = scan(); for(int i = 1 ; i <= N ; ++i){ if(ARR[i] != i){ OK = 0; break; } } if(OK) cout << "Cool Array\n"; else{ MIS[N] = N; int cnt_move = 9876 , chk = 10; for(int i = N - 1 ; i >= 1 ; --i){ MIS[i] = MIS[i + 1]; if(ARR[i] < ARR[MIS[i]]) MIS[i] = i; } for(int i = N ; i >= 1 ; --i) upd(i , ARR[i]); for(int i = 1 ; i < N ; ++i){ int indices = i; int moves = 0; while(indices <= N){ ++moves; if(moves >= chk && moves >= cnt_move){ cnt_move -= 200; break; } indices = MIS[indices]; if(ARR[indices] < ARR[i]){ int lol = 1 + less_query(i , indices - 1 , ARR[i]) - less_query(i , indices - 1 , ARR[indices]); if(lol > ANS){ ANS = lol; IDX1 = i; IDX2 = indices; } } ++indices; } } cout << IDX1 << " " << IDX2; } }