#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<string> #include<vector> #include<set> #include<queue> #include<map> #include<bitset> using namespace std; #define PII pair<int,int> #define X first #define Y second #define PB push_back #define CLR(a) memset(a, 0, sizeof(a)) #define FOR(i,a,b) for (int i=(a);i<(b);i++) #define FOE(i,a,b) for (int i=(a);i<=(b);i++) #define FIT(i,a) for (__typeof__((a).begin()) i = (a).begin(); i != (a).end(); i++) #define TRA(i,a,b) for (int i = (a); i != -1; i = (b)[i]) #define INF (1 << 30) #define EPS (1e-9) #define REP(i,n) FOR(i,0,n) #define LL long long #define MOD 1000000007 #define N 2000000 const double PI = acos(-1.0); #define flt(x,y) ((x)<(y)-EPS) #define fgt(x,y) flt(y,x) #define fle(x,y) !fgt(x,y) #define fge(x,y) !flt(x,y) #define feq(x,y) (fabs((x)-(y))<EPS) struct P{ LL x, y; P(){ } P(LL x,LL y):x(x),y(y){ } void eat(){ scanf("%lf%lf",&x,&y); } P operator+(const P &p)const{ return P(x+p.x, y+p.y); } P operator-(const P &p)const{ return P(x-p.x, y-p.y); } // P operator*(double k){ return P(x*k, y*k); } LL operator*(P p){ return x*p.x + y*p.y; } LL operator^(P p){ return x*p.y - y*p.x; } LL mag2() { return x*x+y*y; } double mag(){ return sqrt(mag2()); } bool operator<(const P &p)const {// usage example: convex hull if (feq(x,p.x)) return flt(y,p.y); return flt(x,p.x); } bool operator==(const P &p)const { return feq(x,p.x) && feq(y,p.y); } void prt() { printf("(%lld,%lld)\n", x, y); } }p[N]; bool ccw(P a, P b, P c) { return fgt((b-a)^(c-a), 0); } vector<P> v1, v2; void MonoHull(P *p, int n, P *hl, int &sz){ sz = 0; sort(p, p + n);//sort in PII for (int i = 0; i < n; i++){ while (sz > 1 && !ccw(hl[sz - 2], hl[sz - 1], p[i])) sz--; hl[sz++] = p[i]; } int k = sz; //find increasing points of lower hull // FOR(i,0,sz) hl[i].prt(); puts("-----------------------"); v2.PB(hl[sz - 1]); for (int i = sz - 2; i >= 0; i--){ if (hl[i].y < v2.back().y) v2.PB(hl[i]); else break; } reverse(v2.begin(), v2.end()); // FOR(i,0,sz) v2[i].prt(); puts("-----------------------"); for (int i = n - 2; i >= 0; i--){//n-1 ?? while (sz > k && !ccw(hl[sz - 2], hl[sz - 1], p[i])) sz--; hl[sz++] = p[i]; } if (sz == 1) hl[sz] = hl[0]; if (sz > 1) --sz; //find increasing points of upper hull v1.PB(hl[0]); for (int i = sz - 1; i >= 0; i--){ if (hl[i].y > v1.back().y) v1.PB(hl[i]); else break; } } P hull[N]; int sz; int n, m, a[N], lds[N], b[3000][3000]; int main(){ scanf("%d", &n); FOR(i,0,n) scanf("%d", a + i); int ok = 1; FOR(i,0,n-1) if (a[i] > a[i + 1]) ok = 0; if (ok){ puts("Cool Array"); return 0; } FOR(i,0,n) p[i].x = i; FOR(i,0,n) p[i].y = a[i]; //FOR(i,0,n) p[i].prt(); MonoHull(p, n, hull, sz); /* FOR(i,0,sz) hull[i].prt(); puts("-----"); FOR(i,0,v1.size()) v1[i].prt(); puts("-----"); FOR(i,0,v2.size()) v2[i].prt(); puts("-----"); */ int aaa = max(v1.size(), v2.size()); //while(aaa > 2000); int tt = -1; PII ans, tmp; FOR(i,0,v1.size()) FOR(j,0,v2.size()){ P x = v1[i], y = v2[j]; if (y.y > x.y) break; tmp = PII(x.x, y.x); int sum = 0; FOR(k,x.x + 1, y.x) if (x.y > a[k] && a[k] > y.y) sum++; sum *= 2; sum++; if (sum > tt || (sum == tt && tmp < ans)){ ans = tmp; tt = sum; } // x.prt(); y.prt(); printf("%d\n", sum); printf("%d %d\n", ans.X, ans.Y); puts("-------------"); } printf("%d %d\n", 1 + ans.X, 1 + ans.Y); return 0; }